【问题标题】:SQLITE FTS3 Query Slower than Standard TabelSQLITE FTS3 查询比标准表慢
【发布时间】:2013-02-04 04:44:59
【问题描述】:

我从源代码构建 sqlite3 以包含 FTS3 支持,然后在包含 150 万行数据的现有 sqlite 数据库中创建一个新表,使用

CREATE VIRTUAL TABLE data USING FTS3(codes text);

后来用

INSERT INTO data(codes) SELECT originalcodes FROM original_data;

然后用

查询每个表
SELECT * FROM original_data WHERE originalcodes='RH12';

这会立即返回,因为我在该列上有一个索引

对 FTS3 表的查询

SELECT * FROM data WHERE codes='RH12';

大约需要 28 秒

有人可以帮助解释我做错了什么,因为我希望这会更快

【问题讨论】:

    标签: sql sqlite fts3


    【解决方案1】:

    documentation 解释:

    可以使用两种不同形式的 SELECT 语句高效地查询 FTS 表:

    • 按 rowid 查询。如果 SELECT 语句的 WHERE 子句包含“rowid = ?”形式的子子句,那么在哪里?是一个 SQL 表达式,FTS 能够使用等效的 SQLite INTEGER PRIMARY KEY 索引直接检索请求的行。
    • 全文查询。如果 SELECT 语句的 WHERE 子句包含“ MATCH ?”形式的子子句,则 FTS 能够使用内置全文索引将搜索限制为与指定的全文查询字符串匹配的那些文档作为 MATCH 子句的右手操作数。

    如果这两种查询策略都不能使用,则对 FTS 表的所有查询都使用对整个表的线性扫描来实现。

    为了高效查询,您应该使用

    SELECT * FROM data WHERE codes MATCH 'RH12'
    

    但这会找到所有包含搜索字符串的记录。

    要有效地执行“普通”查询,您必须在普通表中保留一份数据副本。 (如果要节省空间,可以使用contentless or external content 表。)

    【讨论】:

      【解决方案2】:

      你应该仔细阅读documentation

      使用 WHERE col = 'value' 对虚拟 FTS 表的任何查询都会很慢(对 ROWID 的查询除外),但使用 WHERE col MATCH 'value' 的查询将使用 FTS 并且速度很快。

      【讨论】:

        【解决方案3】:

        我不是这方面的专家,但这里有一些事情需要考虑。 你的测试有缺陷(我认为)。您正在将具有精确文本匹配的场景(索引可以在 original_data 上使用 - 没有什么能胜过这种场景)与 fts3 表上的相等性(我不确定 FTS3 甚至会在这种类型的查询)。如果您想比较苹果和苹果(了解 FTS3 的好处),您需要将 original_data 上的“like”操作与数据上的 FTS3“匹配”操作进行比较。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-02
          • 2019-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-01
          • 2010-12-24
          相关资源
          最近更新 更多