为什么在两个索引列上的 SQLite 查询这么慢?

Why is SQLite query on two indexed columns so slow?

我有一个 table 大约有 6500 万行,我正在尝试 运行 一个简单的查询。 table 和索引如下所示:

CREATE TABLE E(
    x INTEGER,
    t INTEGER,
    e TEXT,
    A,B,C,D,E,F,G,H,I,
    PRIMARY KEY(x,t,e,I)
);
CREATE INDEX ET ON E(t);
CREATE INDEX EE ON E(e);

我 运行ning 的查询如下所示:

SELECT MAX(t), B, C FROM E WHERE e='G' AND t <= 9878901234;

我需要 运行 此查询以获取数千个不同的 t 值,并且希望每个查询在几分之一秒内达到 运行。但是,上述查询花费了将近 10 秒 运行!

我试过 运行查询计划但只得到这个:

0|0|0|SEARCH TABLE E USING INDEX EE (e=?)

所以这应该是使用了索引。通过二进制搜索,我希望更坏的情况只有 26 个测试,我会很快。

为什么我的查询这么慢?

查询中的每个 table 可以使用一个索引。由于您的 WHERE 子句查看多列,因此您可以使用多列索引。对于这些,除了索引中使用的最后一列之外的所有列都必须测试相等性;最后一个使用的可用于大于than/less。

所以:

CREATE INDEX e_idx_e_t ON E(e, t);

应该会给你一个提升。

要进一步了解 Sqlite 如何使用索引,Query Planner documentation 是一个很好的介绍。

您还混合了聚合函数 (max(t)) 和不属于组的列(BC)。在 Sqlite's case 中,这意味着它将从具有最大 t 值的行中选择 BC 的值;其他数据库通常会抛出错误。