【发布时间】:2012-05-07 05:57:51
【问题描述】:
更新:似乎问题(正如许多人所说)是将日期时间字段更改为查询中的日期字段。
使用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
【问题讨论】:
-
请提供执行计划(select前加explain时的输出)
-
每个日期的日历表。从 2008 年到现在,您是否总是每天都去?使用包含每天计数的汇总表可能会更好,而不是每次都重新计算。
-
这个想法是获取高库存图表的数据 - highcharts.com 所以从 2008 年到现在将是理想的。只要至少有 1 个,我就可以每天获得计数……我想如果我不能让它工作,那将是后备。
标签: mysql database-design join