我有一个动态生成的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秒)
还有什么我可以提高查询速度的东西吗?
答案 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