【问题标题】:Caching the resultset of a very slow query缓存一个非常慢的查询的结果集
【发布时间】: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


【解决方案1】:

汇总表——很好。重建它们——不好。相反,每天晚上逐渐增加它们。

使用摘要表,主表需要很少的索引,从而提高加载效率。

摘要表具有适合查询的任何索引。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多