我问题的措词来自博客文章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虚拟表。这似乎证实,对于仅限富时指数的数据库,至少有一些可行的选择。

最佳答案

当表很小时,扫描所有行不需要太多时间。
但是,对于大型表,这可能需要很长时间。(速度将类似于正常的、未编制索引的表。)

关于android - 为什么我们不总是使用FTS表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29887203/

10-10 04:44