我有一个约有6500万行的表,正在尝试对其进行简单的查询。该表和索引如下所示:
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);
我正在运行的查询看起来像这样:
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个测试会更糟,这将是非常快的。
为什么我的查询这么慢?
查询中的每个表都可以使用一个索引。由于WHERE
子句查看多个列,因此可以使用多列索引。对于这些,除了索引中使用的最后一列之外的所有列都必须测试是否相等。最后使用的一个大于或小于一个。
所以:
CREATE INDEX e_idx_e_t ON E(e, t);
应该给你带来帮助。
为了进一步了解Sqlite如何使用索引,Query Planner documentation是一个很好的介绍。
您还将混合函数(max(t)
)和不属于组的列(B
和C
)混合在一起。在Sqlite's case中,这意味着它将从具有最大B
值的行中选择C
和t
的值;其他数据库通常会引发错误。