MySQL如何实现数据排序

MySQL 实现排序的方式大概有两种,一种是索引排序,另一种是文件排序


索引排序

顾名思义,使用索引排序,通常意味着 ORDER BY 的列都在索引中,可以直接通过索引进行排序,这种方式效率最高,因为索引本身就是有序的


文件排序

当无法完全使用索引排序的时候,就需要进行文件排序。

文件排序有两种,内存排序和磁盘文件临时排序

内存排序

MySQL在内存中有一个排序缓冲区,sort_buffer,如果待排序的列取出后没有超过这个缓冲区的大小,就会在 sort_buffer 中进行排序,这个过程也被称为内存排序

sort_buffer 有一个相关的参数,max_length_for_sort_data,超过这个值就会触发双路排序

内存排序有两种,单路排序和双路排序,单路排序可能需要回表一次,也可能不会表(如果SELECT的列全都是ORDER BY的列),双路排序至少要回表一次

假设执行

1
SELECT a, b, c from your_table order by a, b

单路排序

如果查询带a,b,c列的数据行的大小没有超过 max_length_for_sort_data,那么就会把a,b列对应的行都放进 sort_buffer 进行排序

双路排序

如果查询带a,b,c列的数据行的大小超过 max_length_for_sort_data,那么,会将id,a,b放进sort_buffer进行排序,排序结束后再通过id回表找出c列

磁盘文件临时排序

磁盘文件临时排序效率低,算法上通常使用归排