为什么我们不总是使用全文搜索(FTS)表?

3
我的问题来源于Android Quick Tip: Using SQLite FTS Tables博客文章末尾的评论。正如标题所示,该文章介绍了如何在您的Android应用程序中创建和查询全文搜索虚拟表。用户Fer Raviola的评论具体如下:“我的问题是为什么我们不总是使用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的数据库的可行选项。
1个回答

4

当表格很小的时候,扫描所有行不需要太长时间。然而,对于大型表格来说,这可能需要很长时间。(速度将类似于普通未索引的表格。)


那么,在某些情况下,仅使用全文搜索(FTS)数据库是否是可行的选择? - Suragch
可以想象这样的情况。 - CL.
但是在您的观点中,这不是大多数情况下应该采取的方式,对吗? - Suragch
对于非常小的表格,您可能一开始就不需要全文搜索。 - CL.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接