为什么两个索引列上的SQLite查询速度如此之慢?

为什么两个索引列上的SQLite查询速度如此之慢?,sqlite,query-performance,Sqlite,Query Performance,我有一个大约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 <

我有一个大约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;
我正在运行的查询如下所示:

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;
所以这应该使用索引。对于二进制搜索,我希望更糟糕的情况只有26个测试,我会非常快


为什么我的查询这么慢?

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

因此:

应该会给你提振

对于Sqlite如何使用索引的进一步阅读,这是一个很好的介绍


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

我想知道如果您“从E中选择MAX(t),B,C,其中t@Keshav nope,所需时间大致相同,这太棒了!查询时间从~10秒减少到6毫秒。谢谢!