子查詢

子查詢有多種形式,它們具有不同的優化潛力。首先,請注意子查詢可以是相關的不相關的。相關意味著它們依賴於子查詢外部的某些值。這通常意味著必須針對每個外部值重新評估子查詢。

這個相關的子查詢通常非常好。注意:它必須返回最多 1 個值。它通常可用作替代,但不一定比 LEFT JOIN 更快。

SELECT a, b, ( SELECT ... FROM t WHERE t.x = u.x ) AS c
    FROM u ...
SELECT a, b, ( SELECT MAX(x) ... ) AS c
    FROM u ...
SELECT a, b, ( SELECT x FROM t ORDER BY ... LIMIT 1 ) AS c
    FROM u ...

這通常是不相關的:

SELECT ...
    FROM ( SELECT ... ) AS a
    JOIN b ON ...

關於 FROM-SELECT 的註釋:

  • 如果它返回 1 行,那很好。
  • 一個好的範例(同樣是“1 行”)是子查詢為 ( SELECT @n := 0 ),從而初始化`@variable 用於其餘的或查詢。
  • 如果它返回很多行並且 JOIN 也是 ( SELECT ... ) 有很多行,那麼效率可能很糟糕。5.6 之前,沒有索引,所以它成了一個 CROSS JOIN; 5.6+涉及在臨時表上推匯出最佳索引,然後生成它,只有在完成 SELECT 時才將它扔掉。