filesort文件排序可分为单路排序和双路排序:
单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序。
如下面代码是先从索引name先找到name='jack'的主键id,然后根据该id取出所有字段值,然后放入sort_buffer中,然后重复上述过程,直到全部拿完,最后在sort_buffer中按照position排序。
双路排序
:是首先根据相应的条件取出相应的
排序字段
和
可以直接定位行
数据的行 ID,然后在 sort buffer中进行排序,排序完后需要再次取回其它需要的字段。
如下面代码是
先从索引 name 找到第一个满足 name = ‘zhuge’ 的主键id ,根据主键 id 取出整行,把排序字段 position 和主键 id 这两个字段放到 sort_buffer 中,重复上述过程直到拿完所有满足条件值,在对 sort_buffer 中的字段 position 和主键 id 按照字段 position 进行排序 ,最后
还要遍历排序好的 id 和字段 position,在按照 id 的值
回到原表
中取出 所有字段的值返回给客户端。

可以看到单路排序会把所有需要查询的字段都放到 sort buffer 中,而双路排序只会把主键和需要排序的字段放到 sort buffer 中进行排序,然后再通过主键回到原表查询需要的字段,因此,双路排序传入sort_buffer中的字段值较小,占用内存小,单路排序则反之。那么MySQL是如何选择单路排序还是双路排序呢?一般MySQL会根据传入的字段大小来判断 ,如果大于1024KB(默认),则采用单路排序,如果小于1024KB则采用双路排序。