子查询

子查询有多种形式,它们具有不同的优化潜力。首先,请注意子查询可以是相关的不相关的。相关意味着它们依赖于子查询外部的某些值。这通常意味着必须针对每个外部值重新评估子查询。

这个相关的子查询通常非常好。注意:它必须返回最多 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 时才将它扔掉。