2012-02-10 159 views
1

我有一個像這樣的場景;在MySQL中非常緩慢的查詢

我有一個名爲 「tbl_gust_comb_archve_01nov11_beyond

索引鍵在這些領域 「Gidgipsiteidkwkwtypedtgpagedated

而且

此設置表是我的查詢:

SELECT SQL_CALC_FOUND_ROWS 
    gid, gip, siteid, kw, kwtype, dt, count(id) as vpage, sum(mapped) as mapped 
FROM 
    tbl_gust_comb_archve_01nov11_beyond 
WHERE 
    confirmation = 1 
AND 
    dated BETWEEN '2012-01-31' AND '2012-01-31' 
AND 
    siteid = 'bing' 
GROUP BY gid 
ORDER BY dt 
DESC LIMIT 0,50 

如果您將日期設置爲一個範圍,例如'2012-01-31' AND '2012-02-01'那麼結果將花費較長的時間10-30分鐘。

如果你有一個日期範圍,並刪除「GROUP BY」,那麼結果會更快(約5分鐘)。雖然!刪除GROUP BY後,5分鐘也太多了......

表格大小是「30mill記錄和12Gig」。

謝謝!

+12

有你試着用EXPLAIN運行這些查詢?這應該永遠是你在這種情況下的第一步 – 2012-02-10 10:35:11

回答

0

如果siteid變化不大,您可以嘗試刪除您的索引siteid。 如果你有30mill。記錄和1/3與SITEID == 「兵」,那麼你的查詢將

  1. 抓住這些10mill。記錄
  2. 在這10臺磨機上應用你的日期查找。記錄,這可能非常慢。

這很合乎邏輯,因爲選擇一個範圍一般比選擇一個簡單的值要長。如果siteid確實有很大的不同,您可以嘗試在日期 & siteid上添加雙重索引。

對於確認字段,因爲您在歸檔表中,也許您可​​以將尚未確認的人移動到其他表中。如果您能夠取消此檢查,您也可以獲得一些速度。

1

你應該首先do EXPLAIN on the query,正如Mark Ba​​ker在他的評論中所建議的那樣。

但可能產生對這些列的多列索引就可以解決這個問題:

  • dt(這大概應該是第一個)
  • confirmation
  • dated
  • siteid
  • gid

我不知道gid應該如何索引(在哪個位置等)。

詳細信息都在這裏,所以你可以在你自己的解決方案作出決定: