2014-05-21 51 views
0

下面的查詢運行非常快(小於1秒)與一個ID的MySQL GROUP_CONCAT多約束極其緩慢的,但快與一個

SELECT ID, GROUP_CONCAT(CODE SEPARATOR ' ') 
FROM TABLE 
WHERE TYPE='A' AND ID IN (1) 
GROUP BY ID; 

但極其緩慢(超過10秒)時與多於一個的運行ID

SELECT ID, GROUP_CONCAT(CODE SEPARATOR ' ') 
FROM TABLE 
WHERE TYPE='A' AND ID IN (1, 2) 
GROUP BY ID; 

我想這是因爲MySQL試圖首先對所有ID執行GROUP_CONCAT,然後將它與IN約束進行比較。有任何想法嗎?

+1

什麼'的輸出EXPLAIN SELECT ...'兩個查詢? –

+0

同時顯示您的索引。我會猜測,第一個是使用索引合併優化,第二個是掃描行。 –

+0

嗨,大家好,謝謝你的幫忙。由於我提出的查詢錯誤,我已經重述了這個問題。 – roller3d

回答

0

第一個查詢的Boolean邏輯與第二個查詢不相同。

First = TYPE = ('A' AND ID = 1) OR ID = 2 

Second = TYPE = 'A' AND (ID = 1 OR ID = 2) 

http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

+0

如果你說的是真的,那麼只有第二個查詢是正確的。但在這種情況下,他們都返回相同的正確結果。 編輯:我想你可能是對的。我只是試圖將OR語句放在括號()中,但查詢仍然比IN版本運行速度快得多。 – roller3d

+0

@ roller3d,它是正確的。有[AND和OR]的優先級(http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html)。檢查你的數據。 –

+0

對不起,我已經修正了邏輯錯誤,並重新提出了這個問題。 – roller3d

0

我解決了這個問題。 (感謝你們的帶領。)

MySQL在第二個帶有多個ID的查詢中使用了錯誤的TYPE_IDX索引。查詢現在速度更快,當我指定要使用ID_IDX:

SELECT ID, GROUP_CONCAT(CODE SEPARATOR ' ') 
FROM TABLE 
USE INDEX (ID_IDX) 
WHERE TYPE='A' AND ID IN (1, 2) 
GROUP BY ID;