首页 > 解决方案 > SQLite 慢速选择查询 - 如何使其更快

问题描述

在 SQLite 中,我有一个大型数据库(~35Mb)。

它包含一个具有以下语法的表:

CREATE TABLE "log_temperature" (
"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"date"  datetime NOT NULL,
"temperature"  varchar(20) NOT NULL
)

现在当我想在一段时间内搜索数据时,在嵌入式系统上太慢了:

$ time sqlite3 sample.sqlite "select MIN(id) from log_temperature where 
date BETWEEN '2019-08-13 00:00:00' AND '2019-08-13 23:59:59';"
331106

real    0m2.123s
user    0m0.847s
sys     0m0.279s

注 1:ID 运行范围为 210610 到 331600。

注意2:如果我运行'SELECT id FROM log_temperature ORDER BY ASC LIMIT 1',它给出的时间与'MIN'函数完全相同。

我希望“0m2.123s 的实时时间”尽可能接近 0m0.0s。

我有什么选择可以加快速度?(不删除数十万条数据?)

ps.:嵌入式系统参数在这里不重要。这应通过优化查询或底层模式来解决。

标签: sqlperformancesqlite

解决方案


首先,我建议您将查询编写为:

select MIN(id)
from log_temperature 
where date >= '2019-08-13' and date < '2019-08-14';

这不会影响性能,但它使查询更容易编写——并且无需摆弄时间。

然后,你想要一个索引(date, id)

create index idx_log_temperature_date_id on log_temperature(date, id);

我认为id索引中不需要,如果它被声明为表的主键。


推荐阅读