我有一张大约有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
列是我们为报告目的而感兴趣的值。
答案 0 :(得分:0)
汇总表 - 很好。重建他们 - 糟糕。相反,每晚都要逐步增加它们。
使用Summary表,主表只需要很少的索引,从而使加载效率更高。
摘要表包含适合查询的索引。
More discussion of Summary Tables
您的简化版可能会
INSERT INTO Summary ( date, project_id, type_cd, sum_result )
select CURDATE() - INTERVAL 1 DAY,
project_id,
calculation_type_cd,
sum(result)
from calc_calculation_results
WHERE calc_dt >= CURDATE() - INTERVAL 1 DAY
AND calc_dt < CURDATE()
group by project_id,
calculation_type_cd
它可能有
PRIMARY KEY(date, project_id, type_cd),
INDEX(project_id, date),
INDEX(type_cd, date)