MySQL如何实现数据排序
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列
磁盘文件临时排序
磁盘文件临时排序效率低,算法上通常使用归排
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CautionX!