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

问题描述 投票:0回答:1

我有一个约有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个测试会更糟,这将是非常快的。

为什么我的查询这么慢?

sqlite query-performance
1个回答
0
投票

查询中的每个表都可以使用一个索引。由于WHERE子句查看多个列,因此可以使用多列索引。对于这些,除了索引中使用的最后一列之外的所有列都必须测试是否相等。最后使用的一个大于或小于一个。

所以:

CREATE INDEX e_idx_e_t ON E(e, t);

应该给你带来帮助。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.