MYSQL数据排序
https://www.mianshiya.com/question/1780933295526146049
排序过程中,如果排序字段命中索引,就采用索引排序,反之采用文件排序。
文件排序中,如果数据量少就在内存中排序,数据量大就利用磁盘文件进行外部排序。
filesort
当使用explain分析SQL发现执行计划的extra中包含using filesort的时候,说明它无法应用索引的顺序,而主动排序了。
内存排序 性能更高
排序的数据少 < sort_buffer
双路排序
如果select列的长度 > max_length_for_sort_data(默认为4096字节),MYSQL使用row_id排序,把row_id+排序字段放到sort_buffer中进行排序
排序后,再通过id回表查询得到a,b,c,最终把结果返回给客户端。
排序需要多个回表的过程,等于需要两次查询,也叫双路排序。
单路排序
要是select列中的数据没有超过max_length_for_sort_data,那就在直接把select的列全放在sort_data中,进行单路排序
减少了回表的动作,效率更高。