更新:它似乎是问题(如各种人所述)正在将日期时间字段更改为查询中的日期字段。mysql:RIGHT JOIN查询涉及日历表的速度问题
使用DATE(all_griefs_tbl.actioned_date
太慢了,是否有一种更快的方法,但不会将actioned_date更改为日期字段或将其拆分为日期和时间字段?
我有2个表,一个用的是有一个状态和日期时间字段和记录负载另一种是从2008年日期2015年
日历表我想离开是每一个日期在一个时间段和已经被“接受”每一天的记录数 - 即使计数为零 - 这应该是这样的:
| Date | number_accepted |
----------------------------
2012-03-01 723
2012-03-02 723
2012-03-03 1055
2012-03-04 1069
2012-03-05 0
2012-03-06 615
2012-03-07 0
2012-03-08 1072
2012-03-09 664
2012-03-10 859
2012-03-11 0
2012-03-12 778
2012-03-13 987
我试过以下,但也仅仅是快足够少量的数据样本(-1000行)。我需要的东西是非常适用于至少600K行
SELECT calendar.datefield AS Date,
COUNT(all_griefs_tbl.actioned_status) AS total_griefs
FROM all_griefs_tbl
RIGHT JOIN calendar
ON (DATE(all_griefs_tbl.actioned_date) = calendar.datefield)
AND all_griefs_tbl.actioned_status = 'accepted'
WHERE calendar.datefield < CURDATE()
GROUP BY calendar.datefield
感谢
编辑:根据要求
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE calendar range PRIMARY PRIMARY 3 NULL 1576 Using where; Using index
1 SIMPLE all_griefs_tbl ref actioned_status actioned_status 153 const 294975
请提供执行计划(在选择之前添加解释时的输出) – 2012-04-26 13:38:59
您的日历表中包含每个日期。你从2008年开始每天都会去现在的日期吗?您可能会更好地使用每天计数的汇总表,而不是每次重新计算。 – DRapp 2012-04-26 16:29:10
这个想法是获取highstocks图表的数据 - http://www.highcharts.com/,因此从2008年到现在将是理想的。只要至少有1个,我就可以每天获得计数......如果我无法实现这个目标,我想这将会回落。 – eek 2012-04-26 17:01:12