sqlite提高查询速度

时间:2019-10-02 10:06:24

标签: sql performance sqlite

我有一个动态生成的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部分中)是动态添加的。

我的桌子如下:

enter image description here

我在表中有以下索引:

enter image description here

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

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

2 个答案:

答案 0 :(得分:2)

您正在测试一堆列,但是您的索引只能用于一个列,因此将只使用其中的一个(请参阅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

答案 1 :(得分:1)

您可以尝试

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