MySQL查询优化器现在可以将派生表优化应用于相关的标量子查询。这是通过应用额外的分组,然后对提升的谓词进行外部联接来完成的。例如,诸如的查询SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a) > 0可以重写为SELECT t1.* FROM t1 LEFT OUTER JOIN (SELECT a, COUNT(*) AS ct FROM t2 GROUP BY a) AS derived ON t1.a = derived.a WHERE derived.a > 0。
如果子查询已经具有显式分组,则MySQL会将额外的分组添加到现有分组列表的末尾。
MySQL执行基数检查,以确保子查询返回的行不超过一行,ER_SUBQUERY_NO_1_ROW如果返回则进行查询 。在评估提升的谓词之前,检查是评估重写查询中的任何WHEREorJOIN子句的一部分 。
有关更多信息,请参见“ 相关子查询”以及“ 派生表”。
Filesort用于具有ORDER BY ... DESC子句的查询,即使降序列上的索引可用并已使用也是如此。之所以发生这种情况,是因为 ORDER BY即使匹配了相等谓词中的字段也没有删除子句,因此优化程序无法将查询与降序索引进行匹配,从而导致性能欠佳。(缺陷#101220,错误#32038406)