2016-12-14 138 views
0

我有一個約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

你使用任何指標?什麼錯誤正在提出?你是說這個查詢在某個時候死了嗎? –

+2

真的Jason擁有一個14k的代表,你真的應該知道這個問題模糊不清,因爲這只是無法回答。 – RiggsFolly

+0

@TimBiegeleisen我得到[這個錯誤](http://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im)我碰巧遇到問五年前的另一個問題。我桌子上的「SHOW INDEX FROM」確實揭示了許多索引,但我不知道如何分辨相關的內容。 –

回答

0

彙總表 - 很好。重建它們 - 不好。相反,每晚增量增加它們。

使用摘要表,主表需要很少的索引,從而使其更加高效地加載。

摘要表具有適合查詢的任何索引。

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)