@wrlqwe
2016-07-31T16:23:39.000000Z
字数 1157
阅读 2055
sqlite
开发
口袋做app本地搜索,遇到了耗时过长的问题,分析原因如下:
- 数据量很大,因为优先级、排序和分页的关系,只能借助子查询+union来实现,拖慢了速度。
- 每一个子查询都使用了Like,索引没法用。
- iOS9 上SQLite在某些操作上会耗费更长时间(iOS9的6Plus与iOS8的5C搜索某些关键词相比会有一倍的性能落后)。
FTS(Full Text Search)是sqlite virtual table 的一module,它允许用户在sqlite里执行全文搜索。
在iOS和其他一些预制了sqlite的系统里,它通常不会包含在默认的sqlite里,除非重新编译。
看上去使用FTS会解决我们的问题。
我们使用了FMDB来管理数据库,在FMDB的Pod有一个subspec可以直接引入FTS支持:pod 'FMDB/standalone/FTS', '~> 2.6.2'
create virtual table fts_search using fts4 (title, subtitle, content1, content2, content3, drug_id, drug_type)
这里使用 fts4,是考虑到它包含了一些性能上的优化,某些时候可能速度会优于 fts3,需要注意的是,由于fts4有两张 shadow tables 存储额外的信息,所以磁盘占用上会较fts3有一定的提升[1]。
还有就是无需指定column的类型,因为它们都会是 Text 类型。
INSERT INTO fts_search (title, subtitle, content1, content2, content3, drug_id, drug_type) select title, subtitle, content1, content2, content3, drug_id, drug_type from t_search
在搜索上,仅仅把表名替换成了fts表,其他条件都没有动,在iPhone 6 Plus上,对比了两个关键字,各做了两次搜索,结果如下:
关键字 | before(秒) | after(秒) |
---|---|---|
阿奇霉素肠溶 | 8.18905554166849 | 0.859231499998714 |
阿奇霉素肠溶 | 8.45171337500142 | 0.812341541666683 |
复方苯甲酸 | 8.42132416666573 | 0.858444000001327 |
复方苯甲酸 | 7.38970133333351 | 0.82285420833432 |