我的问题的措辞来自博客文章Android Quick Tip: Using SQLite FTS Tables末尾的评论。正如标题所暗示的那样,帖子讲述了如何在Android应用中创建和查询全文搜索虚拟表。用户Fer Raviola的评论专门读取
我的问题是为什么不要'我们总是使用FTS表!我的意思是,他们是 更快
博客作者没有回复(无论如何写作时),但我认为这是一个值得回答的有趣问题。毕竟,可以为整个表格制作FTS表格,而不仅仅是特定的文本列。初看起来,它似乎既简单又加快了查询速度。
还可以完全取消非虚拟表。这将消除必须使虚拟和非虚拟表与triggers和external content tables保持同步。所有数据都将存储在虚拟表中。
@CL. says这不是一个好的选择,因为" FTS表无法有效地查询非FTS搜索。"我认为这与SQLite documentation says here:
的内容有关-- The examples in this block assume the following FTS table:
CREATE VIRTUAL TABLE mail USING fts3(subject, body);
SELECT * FROM mail WHERE rowid = 15; -- Fast. Rowid lookup.
SELECT * FROM mail WHERE body MATCH 'sqlite'; -- Fast. Full-text query.
SELECT * FROM mail WHERE mail MATCH 'search'; -- Fast. Full-text query.
SELECT * FROM mail WHERE rowid BETWEEN 15 AND 20; -- Slow. Linear scan.
SELECT * FROM mail WHERE subject = 'database'; -- Slow. Linear scan.
SELECT * FROM mail WHERE subject MATCH 'database'; -- Fast. Full-text query.
但是慢速查询真的比在普通表上进行普通查询要慢得多吗?如果是这样,为什么?
以下是我可以想到的仅在Android中使用虚拟FTS表的一些潜在缺点:
但就查询本身而言,我不知道问题会是什么。
更新
Android文档示例Storing and Searching for Data在其数据库中仅使用FTS虚拟表。这似乎证实,对于仅有FTS的数据库,至少有一些可行的选择。
答案 0 :(得分:4)
当表格很小时,扫描所有行不会花费太多时间。 但是,对于大型桌子,这可能需要很长时间。 (速度与普通的无索引表类似。)