Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在非常大的表上生成每日报告_Mysql_Sql - Fatal编程技术网

Mysql 在非常大的表上生成每日报告

Mysql 在非常大的表上生成每日报告,mysql,sql,Mysql,Sql,我有一个非常简单的查询,它为我提供每天有多少行的每日报告: SELECT DATE(action_date),COUNT(id) FROM call_history GROUP BY DATE( action_date) (action_date是datetime类型的列) 在具有100000行的表上,此查询大约需要0.5秒 在另一个表上,我现在有1858075,大约需要3秒钟,这个表正在不断增长,很快查询将需要几分钟 使用DATE函数和groupby基本上是删除我的索引,导致查询速度非

我有一个非常简单的查询,它为我提供每天有多少行的每日报告:

SELECT  DATE(action_date),COUNT(id)
FROM  call_history
GROUP  BY DATE( action_date)
(action_date是datetime类型的列)

在具有100000行的表上,此查询大约需要0.5秒

在另一个表上,我现在有1858075,大约需要3秒钟,这个表正在不断增长,很快查询将需要几分钟

使用
DATE
函数和
groupby
基本上是删除我的索引,导致查询速度非常慢

除了在我的表中添加
DATE
列之外,还有什么方法可以加快这一过程吗

添加
DATE
列的问题是,我要按小时/天/年以及更多时间生成报告,并且不能为每种类型都创建一个列

谢谢,
Rami.

让我假设您有一个包含日期的日历表。以下查询可能运行得更快:

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;

它可能会使用索引。

在action\u date字段上是否有索引?
EXPLAIN SELECT DATE(action_DATE)、call_history GROUP BY DATE(action_DATE)中的COUNT(id)的结果是什么是有一个索引,res:1 |简单|调用|历史|全部|空|空|空| 1858075 |使用临时;使用filesort只是我几天前学到的一点见解:仅仅拥有正确的索引可能还不够。有时MySQL优化器没有为查询选择正确的索引。在我的例子中,它通过添加…use index(…)来告诉MySQL要使用哪个索引。。。在我的查询中。我不使用日历表,因为我不关心不显示0个数据行,所以日历实际上可以帮助提高性能吗?我在想另一种方法,左边的组给我的时间与使用子字符串或DATE@user2270158 . . . 那很好。这不是显示没有数据的行,而是说服MySQL使用索引。如果需要,可以使用
have cnt=0
筛选出零值行。我已经生成了一个日历数据库,运行查询,这需要更长的时间,对于我的小(100000)表,时间超过6秒:$您能告诉我该查询是否正在使用索引吗?我可以想出另外两种可能的解决方案(都不吸引人):将日期和时间拆分为两个字段,并使用触发器更新汇总表。
SELECT  DATE(action_date), COUNT(id)
FROM  call_history
GROUP BY LEFT(UglyDateAsStringField, 8);