0

我从源代码构建 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 秒

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

4

3 回答 3

3

文档解释说:

可以使用两种不同形式的 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'

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

为了有效地进行“普通”查询,您必须在普通表中保留一份数据副本。(如果要节省空间,可以使用无内容或外部内容表。)

于 2013-02-03T20:44:59.687 回答
0

您应该更仔细地阅读文档。

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

于 2013-02-03T20:29:01.827 回答
0

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

于 2013-02-03T20:32:17.590 回答