【发布时间】:2017-04-29 05:49:42
【问题描述】:
我有一个大约有 1300 万行的表。每行代表特定项目在特定日期的特定小时内对特定类型的测量。
我有一个查询,可以根据测量类型查找这些值的总和或平均值。很慢,大概几分钟。
我们的某些报告页面利用了此查询的结果,但页面加载需要几分钟的时间是不可接受的。到目前为止,我的解决方案是将查询结果缓存在我所谓的汇总表中。
问题在于刷新汇总表的夜间运行脚本运行时间过长。我什至没有尝试一次刷新整个汇总表,但这仍然需要很长时间。 (“太长”是指引发错误并且刷新作业未完成。)
我有一种预感,我所面临的挑战是由于以错误的方式处理事情的结果,并且解决方案可能不是在这里调整一些事情以将查询运行时间缩短 1% 并且在那里,但要以完全不同的方式解决问题。
任何建议将不胜感激。如果我没有很好地提出这个问题,我深表歉意;我不确定如何更好地制定它。很高兴提供澄清或更多细节。
这是一个需要永远运行的查询的简化版本。 (即使是这个简化版本也需要相当长的时间。)
select date(calc_dt),
project_id,
calculation_type_cd,
sum(result)
from calc_calculation_results
group by date(calc_dt),
project_id,
calculation_type_cd
夜间工作基本上是SELECT INTO,它获取此查询的结果并将它们放入我的汇总表中。 result 列是我们对报告感兴趣的值。
【问题讨论】:
-
您是否在使用任何索引?提出了哪些错误?你是说查询会在某个时候死掉吗?
-
真的是 Jason,拥有 14k 的代表,你真的应该知道,像这样含糊不清的问题是无法回答的。
-
@TimBiegeleisen 我收到了this error,大约五年前我碰巧问了另一个问题。我桌子上的
SHOW INDEX FROM确实显示了许多索引,但我不知道如何判断哪些是相关的。 -
再说一次,一个简化版如果我们修复一个你实际上并没有使用的查询有什么用
-
SHOW CREATE TABLE calc_calculation_results;,或者至少告诉我们列(project_id、calculation_type_cd)上是否有单个索引按特定顺序,以 project_id 作为索引中最左边的列...如果有,则将分组更改为GROUP BY project_id, calculation_type_cd, DATE(calc_dt)并描述性能差异。
标签: mysql performance