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:嵌入式系统参数在这里并不重要。这应该通过优化查询或底层模式来解决。
首先,我建议您将查询编写为:
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如果将其声明为表的主键,我认为索引中不需要它。
| 归档时间: |
|
| 查看次数: |
888 次 |
| 最近记录: |