您的位置:首页 > 数据库 > MySQL

7.2.12. MySQL如何优化ORDER BY

2016-10-09 17:19 246 查看


在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序。

即使ORDER BY不确切匹配索引,只要WHERE子句中的所有未使用的索引部分和所有额外的ORDER BY 列为常数,就可以使用索引。

下面的查询使用索引来解决ORDER BY部分:

SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;

SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;

在某些情况下,MySQL不能使用索引来解决ORDER BY,尽管它仍然使用索引来找到匹配WHERE子句的行。这些情况包括:

· 对不同的关键字使用ORDER BY:

·                SELECT * FROM t1 ORDER BY key1, key2;

· 对关键字的非连续元素使用ORDER BY:

·                SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;

· 混合ASC和DESC:

·                SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;

· 用于查询行的关键字与ORDER BY中所使用的不相同:

·                SELECT * FROM t1 WHERE key2=constant ORDER BY key1;

· 你正联接许多表,并且ORDER BY中的列并不是全部来自第1个用于搜索行的非常量表。(这是EXPLAIN输出中的没有const联接类型的第1个表)。

· 有不同的ORDER BY和GROUP BY表达式。

· 使用的表索引的类型不能按顺序保存行。例如,对于HEAP表的HASH索引情况即如此。

通过EXPLAIN 可以检查MySQL是否可以使用索引来解决查询。如果Extra列内有Using filesort,则不能解决查询。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: