2016-08-23 166 views
0

我有一個嵌套的MySQL查詢在表中有超過500000條記錄的關係。該查詢需要60秒才能獲取結果,並且索引編制已在所有表中完成。減少嵌套mysql查詢的時間

請建議減少執行時間。提前致謝。

SELECT t1.col1,t1.col2 
    FROM table1 AS t1 
    WHERE t1.col2 IN 
    (
     SELECT DISTINCT(t2.col1) FROM table2 AS t2 WHERE t2.col2 IN 
     (
      SELECT t3.col1 
      FROM table3 AS t3 
      WHERE t3.col2 = '04' ORDER BY t3.col1 ASC 
     ) 
     ORDER BY t2.col1 ASC 
    ) 
+0

爲什麼要使用排序??? – apomene

+0

其要求 – DevOps

+2

您只應訂購最終結果集。嘗試分析查詢以查看導致執行時間過長的原因;這很可能是你的「DISTINCT」條款,因爲它們往往會造成延誤。另外,您可以嘗試使用'JOIN'而不是'WHERE ... IN',因爲這通常會更快。 –

回答

2

IN子句進行全表掃描。我相信,如果你使用inner join,就像你將有更好的性能:

SELECT t1.col1,t1.col2 
    FROM table1 AS t1 
INNER JOIN table2 t2 
    ON t1.col2=t2.col1 
INNER JOIN table3 t3 
    ON t2.col1=t3.col1 
WHERE t3.col2 = '04' 
ORDER BY t3.col1 ASC,t2.col1 ASC 
+1

嵌套select查詢總是很慢並且很重,因爲它們將中間數據存儲在內存中。將你的嵌套查詢切換到一個連接(如@apomene所示),它將防止內存負載並提高執行速度。 – deniskoronets

+0

感謝它的魅力。 – DevOps

3

我先前的評論是:

您應該只爲了你的最終結果集。嘗試分析查詢 以查看導致執行時間過長的原因;這很可能是因爲它們通常會導致延遲而導致的DISTINCT子句。此外, 您可以嘗試使用JOIN而不是WHERE ... IN,因爲通常可以使用更快的 。

沒有測試的代碼,但繼我意見的前面,使用JOIN S也是一樣的查詢將類似於:

SELECT t1.col1, 
     t1.col2 
    FROM table1 t1 
    INNER JOIN table2 t2 ON t2.col1 = t1.col2 
    INNER JOIN table3 t3 ON t3.col1 = t2.col2 
    WHERE t3.col2 = '04' 
    ORDER BY t2.col1, t3.col1 

我希望這樣的查詢執行比使用WHERE ... IN顯著更快。

+0

是的,你肯定是對的......謝謝J – DevOps

0

您還可以使用EXISTS條件像

Select t1.col1,t1.col2 FROM table1 AS t1 WHERE EXISTS (
Select t2.col1 FROM table2 as t2 where EXISTS (
    Select t3.col1 FROM table3 AS t3 where t3.col2 = '04' and t2.col2=t3.col1 
) and t1.col2=t2.col1)