【问题标题】:sqlite improve query speedsqlite 提高查询速度
【发布时间】:2019-10-02 10:06:24
【问题描述】:

我有一个动态生成的 sqlite 查询,例如:

SELECT * FROM gsmr_data WHERE test_id='86' AND device='devicename' AND id<4371808 AND (metric='C2' OR metric='C2_N1' OR metric='C2_N2' OR metric='C2_N3' OR metric='C2_N4' OR metric='C2_N5' OR metric='C2_N6') ORDER BY id DESC LIMIT 500

其中 id 基于最后一个结果,而指标(在 OR 部分中)是动态添加的。

我的桌子是这样的:

我在表中有以下索引:

查询需要很长时间(在 sqlite db 浏览器中为 7 秒)

还有什么可以提高查询速度的吗?

【问题讨论】:

    标签: sql performance sqlite


    【解决方案1】:

    您正在测试一堆列,但您的索引仅针对一列,因此只会使用其中一个(请参阅EXPLAIN QUERY PLAN 输出以查看哪一个;运行 ANALYZE 可能会更改哪个查询规划器使用)。

    使用多列索引可以通过限制查看的总行数来提高性能(当然,像所有索引一样,以增加插入、删除和更新行的时间为代价,并占用更多空间)。

    我先看看在WHERE 中使用的所有列上添加索引:

    CREATE INDEX idx_gsmr_data ON gsmr_data(test_id, device, metric, id)
    

    请参阅query optimizer documentation,了解为什么id 是索引中的最后一个。另请参阅 sqlite3 shell 的 .expert command 为查询建议索引,以及 overview of how sqlite uses indexes

    【讨论】:

      【解决方案2】:

      你可以试试

      SELECT * FROM gsmr_data
      WHERE test_id='86' AND device='devicename' AND id<4371808 AND
         metric in('C2', 'C2_N1', 'C2_N2', 'C2_N3', 'C2_N4', 'C2_N5', 'C2_N6')
      ORDER BY id DESC LIMIT 500
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多