MYSQL数据排序

https://www.mianshiya.com/question/1780933295526146049

image-20250408190605233

排序过程中,如果排序字段命中索引,就采用索引排序,反之采用文件排序。

文件排序中,如果数据量少就在内存中排序,数据量大就利用磁盘文件进行外部排序。

filesort

当使用explain分析SQL发现执行计划的extra中包含using filesort的时候,说明它无法应用索引的顺序,而主动排序了。

内存排序 性能更高

排序的数据少 < sort_buffer

双路排序

如果select列的长度 > max_length_for_sort_data(默认为4096字节),MYSQL使用row_id排序,把row_id+排序字段放到sort_buffer中进行排序

image-20250408190959791

排序后,再通过id回表查询得到a,b,c,最终把结果返回给客户端。

排序需要多个回表的过程,等于需要两次查询,也叫双路排序。

单路排序

要是select列中的数据没有超过max_length_for_sort_data,那就在直接把select的列全放在sort_data中,进行单路排序

image-20250408191145383

减少了回表的动作,效率更高。