2012-07-24 150 views
2

表arg_rec在我的測試機器上包含800K行,通常這個表將保存超過15M行。我想運行以下查詢:加快GROUP BY,SUM和AVG查詢

SELECT STE_ID, PNT_NO, YR, MN, AVG(AVR_WS) AS AVR_WS, SUM(AVR_PW) FROM arg_rec GROUP BY STE_ID, PNT_NO, YR, MN; 

該查詢給出了風機數據的日平均風速和總功率。在我的測試機器上,該查詢在執行10分鐘後超時,其合併索引爲STE_IDPNT_NO,YR,MN,它只是主鍵列的一個子集。在沒有索引的情況下,查詢在幾分鐘後完成。

我有相當多股票MySQL安裝運行,除了調整我也想更多地瞭解其他的方法來處理這個問題,如服務器:

  1. 是否有可能創造基於此查詢的視圖並緩存結果?
  2. 是否有更高級的索引功能來封裝YR,MN,DY,HR,MI,SC對應記錄時間戳的年,月,日等字段的事實?
  3. 我最好只使用我的應用程序的業務層複製數據?

回答

8

通過查詢在GROUP最佳的性能,你必須添加覆蓋指數:

ALTER TABLE arg_rec ADD KEY ix1(STE_ID, PNT_NO, YR, MN,AVR_WS, AVR_PW); 

覆蓋索引添加:在使用

  1. 列的條款,然後再
  2. 按組使用的列,然後按
  3. 按列順序依次使用,然後
  4. 在select中使用210
  5. 列。

訪問的詳細信息:Group By Optmization in MySQL

  1. 您可以通過啓用查詢緩存戰利品在Query Cache Configuration

  2. 可以存儲YR緩存在MySQL查詢,MN,DY,HR,MI,SC在數據類型爲TIMESTAMP的單列中將提高索引和按操作分組的性能​​。

+2

通過使用適當的索引從10分鐘下降到0.7秒。 – klonq 2012-07-24 15:37:45

+0

連接按順序排列在哪裏? – 2013-11-15 11:08:20

+0

可以將聯接寫爲where子句查詢。因此,連接首先根據索引序列,然後按順序依次選擇列。 – Omesh 2013-11-19 12:05:25