为什么在两个索引列上的 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)
) 和不属于组的列(B
和 C
)。在 Sqlite's case 中,这意味着它将从具有最大 t
值的行中选择 B
和 C
的值;其他数据库通常会抛出错误。
我有一个 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)
) 和不属于组的列(B
和 C
)。在 Sqlite's case 中,这意味着它将从具有最大 t
值的行中选择 B
和 C
的值;其他数据库通常会抛出错误。