mysql - 使用 MySQL 按年和月分组,同时利用索引并避免临时/文件排序

标签 mysql date query-optimization aggregate

我有一个大型数据集(它将继续增长!),其中批量读取的数据存储在 DATE 列中,因为任何核心数据表中的所有行都属于到特定的一天(上下文是分析/报告)。

许多 View 需要每月而不是每天详细级别的数据,我根据需要通过 SQL(SUM、AVG 等)聚合数据。

这也意味着我按 YEAR()MONTH() 对数据进行分组,这不能使用 DATE 列上的索引并导致查询执行器的 Use temporaryUse 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/

相关文章:

mysql - 根据其他 2 列的值更新列

mysql - 自动启动XAMPP版本7.1.4

php - 如何优化我的查询?

java - if 条件始终返回 true (Java)

C++ 日期中的秒数

MySQL 查询没有正确使用索引?

行级别安全性打开时 Azure SQL 查询性能下降

mysql - Magento:数据库消耗多少RAM?

java - DateFormat 格式方法不显示特定时区的解析日期

php - 优化 codeigniter 查询、Join 或 Where