Use of Indexes to Satisfy ORDER BY
在某些情况下,MySQL可以使用索引来满足ORDER BY子句,以避免执行filesort操作时涉及的额外排序。
如果所有未使用的索引部分和所有额外的ORDER BY字段,在WHERE子句中都是和常量比较,那么即使ORDER BY字段与索引不完全匹配,也可以使用索引。假设(key_part1,key_part2)上有索引。以下查询将使用索引来处理ORDER BY部分:
如果查询混合使用ASC和DESC,则优化器也可以在列上使用索引,如果索引也使用相应的混合ascending and descending (升序列和降序列):
如果key_part1是descending 且key_part2是ascending,则优化器也可以在(key_part1,key_part2)上使用索引。如果key_part1为升序且key_part2为降序,则优化器也可以在这些列上使用索引(使用反向扫描)。请参见第8.3.13节“ Section 8.3.13, “Descending Indexes”
在某些情况下,MySQL不能使用索引来解析ORDER BY,尽管它仍然可以使用索引来查找匹配WHERE子句的行。例子:
- 查询连接多个表,并且ORDER BY中的列不是全部来自用于检索行的第一个nonconstant table。 (第一个nonconstant table是指EXPLAIN输出中第一个 join type不是
const类型的表
) - 具有不同的ORDER BY和GROUP BY表达式的查询。
用于排序的索引的可用性可能受使用列别名影响。假设列t1.a有索引。在下面的语句中,select列表中的列名是a。它引用t1.a,就像在ORDER BY中引用a一样,所以可以使用t1.a上的索引:
在下面的语句中,select语句列表中列的名称也是a,但它使用的是别名。它引用ABS(a),就像在ORDER BY中引用a一样,所以t1.a上的索引不能被使用:
在以下语句中,ORDER BY引用的名称不是select语句列表中列的名称。但是在t1中有一列名为a,所以ORDER BY引用t1.a并且可以使用t1.a上的索引。 (当然,得到的排序顺序可能与ABS(a)的顺序完全不同。)
以前(MySQL 5.7及更低版本),没有显式指定ASC或DESC标识符的GROUP BY默认情况下是隐式排序的。在MySQL 8.0中,如果查询包含GROUP BY而没有显式指定ASC或DESC指示符,则只有在需要对分组进行排序时才会对结果进行排序。在末尾指定ORDER BY NULL以禁止隐式排序(如前所述)不再需要。但是,查询结果可能与以前的MySQL版本不同。要生成给定的排序顺序,请提供ORDER BY子句。