子查詢
子查詢有多種形式,它們具有不同的優化潛力。首先,請注意子查詢可以是相關的或不相關的。相關意味著它們依賴於子查詢外部的某些值。這通常意味著必須針對每個外部值重新評估子查詢。
這個相關的子查詢通常非常好。注意:它必須返回最多 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
時才將它扔掉。