我的问题来源于Android Quick Tip: Using SQLite FTS Tables博客文章末尾的评论。正如标题所示,该文章介绍了如何在您的Android应用程序中创建和查询全文搜索虚拟表。用户Fer Raviola的评论具体如下:“我的问题是为什么我们不总是使用FTS表!我的意思是,它们更快。”博客作者没有回复(至少在撰写本文时没有),但我认为这是一个值得回答的有趣问题。毕竟,FTS表可以为整个表而不仅仅是特定的文本列制作。乍一看,似乎它会简化并加速查询。
但是,慢查询是否真的比在普通表上进行普通查询要慢很多?如果是这样,为什么?
以下是我能想到的仅使用虚拟FTS表在Android中的一些潜在缺点:
- 由于索引占用的空间,表会变得更大。 - 诸如INSERT、UPDATE和DELETE之类的操作会变慢,因为需要更新索引。
但就查询本身而言,我不认为会有什么问题。
更新
Android文档示例存储和搜索数据仅在其数据库中使用了一个FTS虚拟表。这似乎证实了至少存在一些适用于仅使用FTS的数据库的可行选项。
您也可以完全摒弃非虚拟表。这将消除必须使虚拟表和非虚拟表与触发器和外部内容表同步的麻烦。所有数据将存储在虚拟表中。
@CL.说这不是一个好的选择,因为“FTS表不能高效地查询非FTS搜索。”我认为这与SQLite文档在此处所说的内容有关:
-- 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.
但是,慢查询是否真的比在普通表上进行普通查询要慢很多?如果是这样,为什么?
以下是我能想到的仅使用虚拟FTS表在Android中的一些潜在缺点:
- 由于索引占用的空间,表会变得更大。 - 诸如INSERT、UPDATE和DELETE之类的操作会变慢,因为需要更新索引。
但就查询本身而言,我不认为会有什么问题。
更新
Android文档示例存储和搜索数据仅在其数据库中使用了一个FTS虚拟表。这似乎证实了至少存在一些适用于仅使用FTS的数据库的可行选项。