🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
mysql有两种方式可以生成有序的结果:通过排序,或者按照索引顺序扫描(有2种排序算法). 如果explain出来的type列的值为index.则说明mysql使用了索引扫描来做排序(不要和extra列的Using index搞混淆了) 扫描索引本身就是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录.但如果索引不能覆盖查询所需要的全部列,那就不得不每扫描一条索引记录都回表查询一次对应的行.这基本上都是随机IO,因此按索引顺序读取的速度通常要比顺序的全表扫描要慢,尤其是在IO密集型的工作负载时 mysql可以使用同一个索引即满足排序,又用于查找行.因此,如果可能,设计索引时应该尽可能同时满足这两种任务,这样最好 只有当索引的列顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向(倒序或正序)都一样,mysql才能使用索引来对结果做排序.如果查询需要关联多张表,则只有当ORDER BY子句引用的字段全部为第一个表,才能使用索引做排序.order by子句和查找型查询的限制是一样的:需要满足索引的最左前缀的要求.否则,mysql都需要执行排序操作,而无法利用索引排序 ![](https://box.kancloud.cn/96d15853f5da750b2f8dea0ff08f12ee_804x404.png) ![](https://box.kancloud.cn/2e909e4ba125008c646b39c71e6e264d_792x505.png) ![](https://box.kancloud.cn/34e29a30cf3c5e926b4d2608e35972c3_789x605.png) ![](https://box.kancloud.cn/eb704b91c07eb5488e1f7a8c22da8967_761x405.png)