生成非常大的表的每日报告

时间:2014-03-29 14:07:10

标签: mysql sql

我有一个非常简单的查询,它每天都会报告每天有多少行:

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列的问题是我按小时/天/年等生成报告,而且我不能为每种类型生成一列。

谢谢, 拉米。

1 个答案:

答案 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);

它可能会使用索引。