2013-03-20 43 views
1

我有兩個領域,像這樣創建了一個簡單的鍵 - 值表:如何加快MySQL中緩慢的SUM + ORDER BY + LIMIT查詢?

CREATE TABLE `mytable` (
    `key` varchar(255) NOT NULL, 
    `value` double NOT NULL, 
    KEY `MYKEY` (`key`) 
); 

的關鍵不是唯一的。該表包含超過一百萬條記錄。我需要一個查詢來總結給定鍵的所有值,並返回前10個鍵。這裏是我的嘗試:

SELECT t.key, SUM(t.value) value 
    FROM mytable t 
    GROUP BY t.key 
    ORDER BY value DESC 
    LIMIT 0, 10; 

但是,這是非常。事情是,沒有GROUP BY和SUM,它非常快,沒有ORDER BY,它非常快,但由於某種原因,兩者的組合使它非常慢。任何人都可以解釋爲什麼這樣,以及如何加速?


沒有價值指數。我試圖創建一個,但它沒有幫助。


EXPLAIN EXTENDED產生在工作臺下面:

id select_type table type possible_keys key key_len ref rows filtered Extra 
1 SIMPLE  t  index NULL   MYKEY 257  NULL 1340532 100.00 "Using temporary; Using filesort" 

有在表中約400K唯一鍵。


該查詢需要3分鐘以上才能運行。我不知道多久,因爲我在3分鐘後停止了它。 但是,如果我刪除鍵上的索引,它會在30秒內運行!任何人有任何想法爲什麼?

+1

你有價值指數嗎? – Pete 2013-03-20 16:24:50

+1

您能否爲我們提供該查詢的'EXPLAIN EXTENDED'輸出? – Adrian 2013-03-20 16:25:55

+0

查詢將生成一箇中間表,然後對其進行排序。我懷疑緩慢的位是排序,雖然都不會很快。你有多少個獨特的鑰匙?您將無法有效地索引值,因爲您正在計算它作爲查詢的一部分。 – Jaydee 2013-03-20 16:31:34

回答

2

就我所見,真正加快速度的唯一方法是創建一個帶有唯一鍵的獨立表並保持總值。然後,您將能夠對值進行索引以快速檢索前十名,並且計算也將完成。只要表格沒有在太多的地方更新,這應該不是一個主要問題。

這種類型的查詢的主要問題是group by需要索引一個順序和order by需要排序到不同的順序。

+0

Jaydeep,所以我們需要每次在主表中記錄更改時更新新表中的記錄。我們可以使用觸發器或其他東西來實現這一點嗎? – kishan 2015-05-11 12:38:28