【问题标题】:Why is SQLite query on two indexed columns so slow?为什么对两个索引列的 SQLite 查询这么慢?
【发布时间】:2020-05-03 23:13:50
【问题描述】:

我有一个包含大约 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 个测试,我会很快。

为什么我的查询这么慢?

【问题讨论】:

  • 我想知道如果你执行 "SELECT MAX(t), B, C FROM E WHERE t
  • @Keshav 不,它需要大约相同的时间

标签: sqlite query-performance


【解决方案1】:

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

所以:

CREATE INDEX e_idx_e_t ON E(e, t);

应该会给你一个动力。

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

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

【讨论】:

  • 太棒了!查询时间从约 10 秒减少到 6 毫秒。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 2020-03-19
  • 2014-03-12
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多