什么单路排序,什么是双路排序

filesort 文件排序方式:

  • 单路排序:是一次性取出满足行的全部字段,然后再内存中排序,然后返回结果。(占用内存更大,但是不需要回表)用trace工具可
    以看到sort_mode信息里显示< sort_key, additional_fields >或者<
    sort_key,packed_additional_fields >

  • 双路排序:是先取出id、排序字段。在内存中排完序以后,再根据id去回表查出其他所需字段,然后返回结果。(占用内存更小,但需要回表)用trace工具可以看到sort_mode信息里显示<
    sort_key, rowid > MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节)
    的大小和需要查询的字段总大小来

判断使用哪种排序模式。
如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;
如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模∙式。

我们先看单路排序的详细过程:

  1. 从索引name找到第一个满足 name = ‘ zhuge’ 条件的主键 id
  2. 根据主键 id 取出整行,取出所有字段的值,存入 sort_buffer 中
  3. 从索引name找到下一个满足 name = ‘ zhuge’ 条件的主键 id
  4. 重复步骤 2、3 直到不满足 name = ‘ zhuge’
  5. 对 sort_buffer 中的数据按照字段 position 进行排序
  6. 返回结果给客户端 我们再看下双路排序的详细过程:
  7. 从索引 name 找到第一个满足 name = ‘ zhuge’ 的主键id
  8. 根据主键 id 取出整行,把排序字段 position 和主键 id 这两个字段放到 sort buffer 中
  9. 从索引 name 取下一个满足 name = ‘ zhuge’ 记录的主键 id
  10. 重复 3、4 直到不满足 name = ‘ zhuge’
  11. 对 sort_buffer 中的字段 position 和主键 id 按照字段 position 进行排序
  12. 遍历排序好的 id 和字段 position,按照 id 的值回到原表中取出 所有字段的值返回给客户端