我从源代码构建了包含FTS3支持的sqlite3,然后使用以下命令在现有的sqlite数据库中创建了一个包含150万行数据的新表
CREATE VIRTUAL TABLE data USING FTS3(codes text);然后使用
INSERT INTO data(codes) SELECT originalcodes FROM original_data;然后使用以下命令查询每个表
SELECT * FROM original_data WHERE originalcodes='RH12';这会立即返回,因为我对该列有一个索引
对FTS3表的查询
SELECT * FROM data WHERE codes='RH12';差不多需要28秒
有没有人能帮我解释一下我做错了什么,因为我预计这会快很多
发布于 2013-02-04 04:45:00
documentation解释说:
可以使用两种不同形式的SELECT语句高效地查询
FTS表:
按行by的
如果这两种查询策略都不能使用,则对FTS表的所有查询都使用整个表的线性扫描来实现。
为了实现高效的查询,您应该使用
SELECT * FROM data WHERE codes MATCH 'RH12'但这将查找包含搜索字符串的所有记录。
要有效地执行“普通”查询,您必须在普通表中保留数据的副本。(如果您想节省空间,可以使用contentless or external content表。)
发布于 2013-02-04 04:29:02
您应该更仔细地阅读documentation。
使用WHERE col = 'value'对虚拟FTS表的任何查询都会很慢(除了对ROWID的查询),但使用WHERE col MATCH 'value'的查询将使用FTS和fast。
发布于 2013-02-04 04:32:18
我不是这方面的专家,但这里有一些需要考虑的事情。你的测试有缺陷(我认为)。您正在将文本完全匹配(索引可以在original_data上使用-没有什么比这个场景更好)与fts3表上的相等(我不确定FTS3是否会在这种类型的查询中起作用)的场景进行对比。如果您想要进行比较(以了解FTS3的好处),您将需要比较original_data上的"like“操作和数据上的FTS3 "match”操作。
https://stackoverflow.com/questions/14676779
复制相似问题