SQLite:实现布尔检索的最快方法

问题描述

我有一个包含 featuresdocument 列的 sqlite 表 feature

没有一列是UNIQUE,这是我可以做的

SELECT feature FROM features WHERE document=121;

获取文档 121 的所有功能

SELECT document FROM features WHERE feature=11;

获取所有具有特征 11 的文档。

现在我想问布尔检索问题,例如:

给我所有具有特征 11、15、143、1222、2001 的文档。

查询的特征列表的长度是变化的。

当然我在两列上有一个索引。

我认为使用 INTERSECT 关键字,它会查询每个特征的整个表,而不是理解布尔 AND 并通过迄今为止具有所有特征的文档重复过滤 document 列。

对这些布尔 AND 连接的查询进行建模的最快查询是什么?

解决方法

首先为 feature 列创建一个索引,以便在过滤表以获取所需功能时使用它:

CREATE INDEX idx_feature ON features(feature);

然后像这样使用聚合:

SELECT document 
FROM features 
WHERE feature IN (11,15,143,1222,2001)
GROUP BY document
HAVING COUNT(*) = 5; // the number of features that you want

HAVING 子句中的条件确保返回的 document 包含全部 5 个 feature