2011-11-12 23 views
1

有人可以告訴我如何使用加快這個MySQL查詢。我知道它由於計數(distinct subcontractorRef)語法而正在運行緩慢。任何其他的選擇?我怎麼能加快MySQL查詢時使用運行一個選擇使用計數(清晰)查詢

SELECT DISTINCT (contractorsRef) AS cref, RIDGROUP AS ridg, 
    (select count(DISTINCT subcontractorRef) 
    FROM request 
    INNER JOIN request_config ON request_config.RIDGROUP = request.RIDGROUP 
    WHERE request_config.contractorsRef = outer_config.contractorsRef 
    AND currenttaxyear =2011 
    AND weekno =31) AS xxx 
FROM request_config outer_config 
WHERE currenttaxyear =2011 
AND weekno =32 
AND contractorsRef <>132 
+0

請將'EXPLAIN SELECT ...','SHOW CREATE TABLE request_config'和'SHOW CREATE TABLE request'的輸出貼出來。 –

+0

首先回答所有數據庫加速問題:索引。你有嘗試過嗎? –

回答

1

試試這個使用JOIN,而不是一個子查詢:

SELECT 
    contractorsRef AS cref, 
    RIDGROUP AS ridg, 
    IFNULL(T1.subcontractorCount, 0) AS xxx 
FROM request_config AS outer_config 
LEFT JOIN 
(
    SELECT 
     request_config.contractorsRef, 
     COUNT(DISTINCT subcontractorRef) AS subcontractorCount 
    FROM request 
    INNER JOIN request_config 
    ON request_config.RIDGROUP = request.RIDGROUP 
    AND currenttaxyear = 2011 
    AND weekno = 31 
    GROUP BY contractorsRef 
) T1 
ON T1.contractorsRef = outer_config.contractorsRef 
WHERE currenttaxyear = 2011 
AND weekno = 32 
AND contractorsRef <> 132 
GROUP BY outer_config.contractorsRef 
+0

這有效,但速度與我以另一種方式完成相同。我怎麼能結合計數(*),然後使用不同的,因爲我讀這是比計數(獨特的XX)更快的方式? – user984314

+0

@ user984314:你有沒有試過添加任何索引? '(currenttaxyear,weekno)'上的索引可能會有所幫助。 –

0

猜測,因爲我們不知道任何索引。但是一個非常常見的錯誤是沒有索引來覆蓋where子句中的表。從外 例如選擇:

FROM request_config WHERE currenttaxyear = 2011 AND weekno = 32 AND contractorsRef <> 132

然後,你需要的索引: 上request_config創建索引mynewIndex(currenttaxyear,weekno, contractorsRef) 該索引中列的順序可以產生很大的差異。所以嘗試改變他們的技巧。

+0

我已經有一個索引就像你解釋 – user984314

+0

那麼我需要更多的信息indexm查詢計劃和表是更多的幫助 –

相關問題