SQLite 慢速选择查询 - 如何使其更快

Dan*_*iel 2 sql sqlite performance

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

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

CREATE TABLE "log_temperature" (
"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"date"  datetime NOT NULL,
"temperature"  varchar(20) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

注1:id 的范围是从 210610 到 331600。

注意2:如果我运行“SELECT id FROM log_tempORDER BY ASC LIMIT 1”,它会给出与“MIN”函数完全相同的计时。

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

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

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

Gor*_*off 5

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

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

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

然后,您需要一个索引(date, id)

create index idx_log_temperature_date_id on log_temperature(date, id);
Run Code Online (Sandbox Code Playgroud)

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