【发布时间】:2014-05-09 00:34:28
【问题描述】:
此查询耗时过长(800mhz cpu 上超过 15000 条记录):
select count(*) from events where millis > date("now", "start of month")
该字段定义为millis INT,当我运行查询(或我想出的任何其他变体)时,sqlite 似乎会对它比较的每条记录进行日期转换。我用 strace 看到的:
read(3, "\r\0\0\0\21\0H\0\3\310\3\220\3X\3 \2\350\2\260\2x\2@\2\10\1\320\1\230\1`"..., 1024) = 1024
gettimeofday({1399595165, 605812}, NULL) = 0
gettimeofday({1399595165, 609833}, NULL) = 0
gettimeofday({1399595165, 611851}, NULL) = 0
gettimeofday({1399595165, 618546}, NULL) = 0
gettimeofday({1399595165, 623135}, NULL) = 0
gettimeofday({1399595165, 626291}, NULL) = 0
gettimeofday({1399595165, 634558}, NULL) = 0
gettimeofday({1399595165, 636463}, NULL) = 0
gettimeofday({1399595165, 638986}, NULL) = 0
gettimeofday({1399595165, 669426}, NULL) = 0
gettimeofday({1399595165, 675431}, NULL) = 0
...
And it keeps running
¿有没有一种有效的方法来计算属于当天的记录,将“现在”转换为 int 一次,然后进行简单的数学运算?
编辑:正如 CL 指出的那样,只需预先计算日期就足够了。无需将其转换为 int。以下工作更快(没有日期比较):
select date( "now", "-1 day");
2014-05-08
sqlite> select count(millis) from events where millis > "2014-05-08";
1177
另一件显着提高性能的事情是在列上创建索引,就像在任何其他数据库引擎上所做的那样。不知道为什么我认为 SQLite 不支持它们。
仅作记录:
sqlite> create index ievemts_millis on events (millis);
sqlite> select date( "now", "-1 day");
2014-05-08
sqlite> select count(millis) from events where millis > "2014-05-08";
1177
【问题讨论】:
-
date返回yyyy-mm-dd格式的字符串 ...