我有一个非常简单的查询,它每天都会报告每天有多少行:
SELECT DATE(action_date),COUNT(id)
FROM call_history
GROUP BY DATE( action_date)
(action_date是日期时间类型列)
在具有100,000行的表上,此查询大约需要0.5秒,
在我目前的1,858,075的其他桌面上花了大约3秒钟,这张桌子一直在增长,很快查询将需要几分钟......
将DATE
函数与GROUP BY
一起使用基本上是删除索引并导致查询速度非常慢。
除了在我的表格中添加DATE
列之外,还有什么办法可以加快速度吗?
添加DATE
列的问题是我按小时/天/年等生成报告,而且我不能为每种类型生成一列。
谢谢, 拉米。
答案 0 :(得分:0)
我假设您有一个日历表,其中包含日期。以下查询可能运行得更快:
SELECT c.thedate,
(select count(*)
from call_history ch
where ch.action_date >= c.thedate and
ch.action_date < c.thedate + interval 1 day
) as cnt
FROM calendar c
oRDER BY c.thedate;
通过用相关子查询替换聚合,可以说服MySQL实际使用索引。
MySQL使用group by
的索引非常糟糕。您可以尝试使用日期的技巧,这真的很难吃。如果将日期存储为字符串,例如YYYYMMDDHHMISS,则可以在日期字段上创建子字符串索引。这是MySQL最接近功能索引(或计算列上的索引)。然后您就可以将查询表达为:
SELECT DATE(action_date), COUNT(id)
FROM call_history
GROUP BY LEFT(UglyDateAsStringField, 8);
它可能会使用索引。