2010-09-24 207 views
1

我有以下SQL:當單獨運行需要優化嵌套查詢語句

SELECT customfieldvalue.ISSUE 
FROM customfieldvalue 
WHERE customfieldvalue.STRINGVALUE 
IN (SELECT customfieldvalue.STRINGVALUE 
    FROM customfieldvalue 
    WHERE customfieldvalue.CUSTOMFIELD = "10670" 
    GROUP BY customfieldvalue.STRINGVALUE 
    HAVING COUNT(*) > 1); 

內部的嵌套select返回3265行中1.5secs在MySQL 5.0.77。 customfieldvalue表包含2286831行。

我想回到這個問題列的所有值,其中的STRINGISSUE列值不是專用於該行和列的CustomField包含「10670」。

當我嘗試運行上面的查詢中,MySQL似乎被卡住。我已經離開它運行了一分鐘,但我很確定問題是我的查詢。

+0

,而不是使用count(*)使用count(1) – 2010-09-24 15:28:47

回答

0

嘗試一些沿着這些路線:

SELECT cfv1.ISSUE 
    COUNT(cfv2.STRINGVALUE) as indicator 

    FROM customfieldvalue cfv1 

    INNER JOIN customfieldvalue cfv2 
    ON cfv1.STRINGVALUE = cfv2.STRINGVALUE AND cfv2.CUSTOMFIELD = "10670" 

    GROUP BY cfv1.ISSUE 
    HAVING indicator > 1 

這可能不會對複製粘貼&工作,我還沒有證實此事,但是在MySQL連接是往往比多子查詢更快,甚至數量級。

+0

我同意,加入應該會更快這裏。 – 2010-09-24 18:27:30

+0

根據連接刪除重複項的後處理將會影響您感知的速度提升。取決於所涉及的行數,但數據集越大,該方法越不可能擴展。通過檢查EXPLAIN計劃和比較,使用適合工作的工具,而不是基於像「JOINs總是更快」和「子查詢不好」這樣的神話。 – 2010-09-25 17:40:58

+0

@OMG:我添加了「經常」這個詞,讓你感覺更好。無論如何,如果你沒有什麼可與之比較的東西,就要比較什麼。 – 2010-09-25 19:01:00