缓存查询速度非常慢的结果集

时间:2016-12-14 01:39:41

标签: mysql performance

我有一张大约有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列是我们为报告目的而感兴趣的值。

1 个答案:

答案 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)