为什么我们不总是使用FTS表?

时间:2015-04-27 04:25:39

标签: android sqlite full-text-search

我的问题的措辞来自博客文章Android Quick Tip: Using SQLite FTS Tables末尾的评论。正如标题所暗示的那样,帖子讲述了如何在Android应用中创建和查询全文搜索虚拟表。用户Fer Raviola的评论专门读取

  

我的问题是为什么不要'我们总是使用FTS表!我的意思是,他们是   更快

博客作者没有回复(无论如何写作时),但我认为这是一个值得回答的有趣问题。毕竟,可以为整个表格制作FTS表格,而不仅仅是特定的文本列。初看起来,它似乎既简单又加快了查询速度。

还可以完全取消非虚拟表。这将消除必须使虚拟和非虚拟表与triggersexternal 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表的一些潜在缺点:

  • 由于索引的大小,表格会更大。
  • INSERT,UPDATE和DELETE等操作会变慢,因为索引必须更新。

但就查询本身而言,我不知道问题会是什么。

更新

Android文档示例Storing and Searching for Data在其数据库中仅使用FTS虚拟表。这似乎证实,对于仅有FTS的数据库,至少有一些可行的选择。

1 个答案:

答案 0 :(得分:4)

当表格很小时,扫描所有行不会花费太多时间。 但是,对于大型桌子,这可能需要很长时间。 (速度与普通的无索引表类似。)