我有一个大型数据集(它将继续增长!),其中批量读取的数据存储在 DATE
列中,因为任何核心数据表中的所有行都属于到特定的一天(上下文是分析/报告)。
许多 View 需要每月而不是每天详细级别的数据,我根据需要通过 SQL(SUM、AVG 等)聚合数据。
这也意味着我按 YEAR()
和 MONTH()
对数据进行分组,这不能使用 DATE
列上的索引并导致查询执行器的 Use temporary
和 Use filesort
。
最好的解决方案是将 DATE
列拆分为 3 个单独的年、月和日列吗?或者保留 DATE
列(约束、排序等)并有一个也被索引的“yearmonth”(yyyymm)列?我不喜欢重复数据,但我并不是 100% 确定什么是这种情况下的最佳做法。
最佳答案
不要将 DATE 拆分为组成部分。困难大于预期的好处。
使用汇总表避免冗长的分析/报告。参见 my blog在这样的。粗略地说,每天晚上你都会计算过去一天的一些小计和计数,并将这些放在“汇总表”中。与“事实”表相比,分析对该表的运行速度要快得多。
对于 AVG,一定要存储 SUM() 和 COUNT(*),计算(在报告中)SUM(sums)/SUM(counts) 作为平均值
。
关于mysql - 使用 MySQL 按年和月分组,同时利用索引并避免临时/文件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29674108/