2016-05-10 147 views
0

我有一個優化的問題,我想執行的子查詢第一SQL子查詢優化,如何執行子查詢第一

EXPLAIN 
SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE linkReferenced IN (SELECT id 
          FROM Link_galaxia 
          WHERE idConceptStart IN (616269,616268,615721) 
           AND idConceptLink = 315 
           AND idConceptTarget = 29209 
         ) 
    AND `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037) 

主要查詢返回一百萬條記錄到存儲數據的hudge量。雖然子查詢

SELECT ID FROM Link_galaxia WHERE idConceptStart IN (616269,616268,615721)AND idConceptLink = 315和idConceptTarget = 29209)

返回數據的少量。如何管理先執行子查詢?

的結果說明

1 PRIMARY References_galaxia ALL unique_ref,linkReferenced NULL NULL NULL 9163156 Using where 
1 PRIMARY Link_galaxia eq_ref PRIMARY PRIMARY 4 eds_sandra.References_galaxia.linkReferenced 1 
2 DEPENDENT SUBQUERY Link_galaxia eq_ref PRIMARY,idx_name,idConceptStart,idConceptStart_4,idConceptTarget,idConceptLink PRIMARY 4 References_galaxia.linkReferenced 1 Using where 

謝謝你很多關於你的幫助!

+3

你似乎不太喜歡'JOIN'這個詞。 – Strawberry

回答

0

的查詢,如下面的代碼將會顯得更優化:

SELECT columns, I, actually, want 
    FROM `References_galaxia` r 
    JOIN Link_galaxia x 
    ON x.id = r.linkreferenced 
    JOIN Link_galaxia y 
    ON y.id = r.linkReferenced 
WHERE r.idConcept IN (416,36053,36088,36037) 
    AND y.idConceptStart IN (616269,616268,615721) 
    AND y.idConceptLink = 315 
    AND y.idConceptTarget = 29209 

有關提高此查詢的性能幫助,我們需要看到表創建語句對所有相關表格,以及說明。

+0

太棒了! Woks like a charm – user3032887

+0

我必須承認我更喜歡原始查詢 - 除了那個過時的連接語法。我認爲'IN'子句使其更具可讀性。但看起來,MySQL仍然有一個'IN'子句的弱點。我認爲他們終於設法更好地處理了它們。 @ user3032887:你使用的是哪個版本? –

+0

我們使用版本5.1.49 – user3032887

0
SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037) 
    AND Link_galaxia.idConceptStart IN (616269,616268,615721) 
    AND Link_galaxia.idConceptLink = 315 
    AND Link_galaxia.idConceptTarget = 29209 
0

只要運行在可變

SELECT id INTO @idvar FROM Link_galaxia 
        WHERE idConceptStart IN (616269,616268,615721) 
        AND idConceptLink = 315 
        AND idConceptTarget = 29209 

修改子查詢和店鋪ID,包括該變種(@idvar)到主SQL

SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE linkReferenced IN @idvar 
    AND `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037); 

完整代碼可以與交易:

START TRANSACTION; 
SELECT id INTO @idvar FROM Link_galaxia 
         WHERE idConceptStart IN (616269,616268,615721) 
         AND idConceptLink = 315 
         AND idConceptTarget = 29209; 
SELECT * 
    FROM `References_galaxia` 
    , Link_galaxia 
WHERE linkReferenced IN @idvar 
    AND `References_galaxia`.linkReferenced = Link_galaxia.id 
    AND `References_galaxia`.idConcept IN (416,36053,36088,36037); 
COMMIT;