子查询
子查询有多种形式,它们具有不同的优化潜力。首先,请注意子查询可以是相关的或不相关的。相关意味着它们依赖于子查询外部的某些值。这通常意味着必须针对每个外部值重新评估子查询。
这个相关的子查询通常非常好。注意:它必须返回最多 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
时才将它扔掉。