专注于Java领域优质技术,欢迎关注
文章转载自yangyidba , 作者 杨奇龙
一 前言
为什么是再说呢?因为前面已经写过 《order by 原理以及优化》 ,介绍 order by 的基本原理以及优化。如果觉得对 order by 原理了解不透彻可以参考其他同行的文章《MySQL排序内部原理探秘》.本文是基于官网文档的二刷(基本翻译+测试验证),看完本文大部分开发同学可以了解到什么样的select + order by 语句可以使用索引,什么样的不能利用到索引排序。
二 分析
2.1 官方标准介绍
对于select order by语句如何能够利用到索引,官方表述如下:
"The index can also be used even if the ORDER BY does not match the index exactly, as long as all of the unused portions of the index and all the extra ORDER BY columns are constants in the WHERE clause."
翻译一下就是
即使ORDER BY语句不能精确匹配(组合)索引列也能使用索引,只要WHERE条件中的所有未使用的索引部分和所有额外的ORDER BY列为常数就行。如何理解这句话呢?我们通过具体用例来解释。
2.2 准备工作
2.3 能够利用索引的例子分析
官方的文档 中介绍有7个例子可以使用索引进行排序。如果使用explain/desc工具查看执行计划中的extra中出现了Using filesort则说明sql没有用到排序优化。
案例一
SELECT * FROM t1 ORDER BY key_part1,key_part2,...;
分析:
显然上述sql没有利用到索引排序. type=ALL Extra=Using fileso