sql - 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.:嵌入式系统参数在这里不重要。这应通过优化查询或底层模式来解决。
解决方案
首先,我建议您将查询编写为:
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
索引中不需要,如果它被声明为表的主键。
推荐阅读
- java-8 - 我可以从数字列表中创建一个包含多个 put 的地图列表吗?
- jquery - 如何获取搜索内容的默认页码?
- unity3d - Unity 编辑器脚本调试堆栈跟踪错误
- node.js - 多商品订单的 MongoDB 模型设计
- c# - 添加外部类
- amazon-web-services - 将 Kibana 导出为 CSV
- javascript - Webpack DevServer 太慢还是我做错了什么?
- azure-virtual-network - 限制特定用户对特定资源的点到站点 Azure VPN 访问
- json - 使用 JSR223 PreProcessor 在 Jmeter 中创建带有变量的数组 Json 对象(表单 csv)
- android - Android - 菜单项未显示在工具栏上