【问题标题】:SQLite slow select query - howto make it fasterSQLite 慢速选择查询 - 如何使其更快
【发布时间】:2019-08-13 17:29:29
【问题描述】:

在 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.:嵌入式系统参数在这里并不重要。这应通过优化查询或底层架构来解决。

【问题讨论】:

  • 有索引吗?
  • @Sami:是的,id 有一个索引,(id,date) 也有它。现在我不知道索引也可以在不唯一的情况下定义,所以我现在为日期字段添加了一个索引,这消除了慢查询 - 正如 Patrick 首先建议的那样。

标签: sql performance sqlite


【解决方案1】:

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

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,如果它被声明为表的主键。

【讨论】:

    【解决方案2】:

    你能在日期上创建一个索引吗?

    CREATE INDEX index_name ON log_temperature(date);
    

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2019-11-24
      • 2011-05-03
      • 2019-05-24
      • 2012-03-30
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多