MYSQL单路排序和双路排序
什么单路排序,什么是双路排序
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 ,那么使用 双路排序模∙式。
我们先看单路排序的详细过程:
- 从索引name找到第一个满足 name = ‘ zhuge’ 条件的主键 id
- 根据主键 id 取出整行,取出所有字段的值,存入 sort_buffer 中
- 从索引name找到下一个满足 name = ‘ zhuge’ 条件的主键 id
- 重复步骤 2、3 直到不满足 name = ‘ zhuge’
- 对 sort_buffer 中的数据按照字段 position 进行排序
- 返回结果给客户端 我们再看下双路排序的详细过程:
- 从索引 name 找到第一个满足 name = ‘ zhuge’ 的主键id
- 根据主键 id 取出整行,把排序字段 position 和主键 id 这两个字段放到 sort buffer 中
- 从索引 name 取下一个满足 name = ‘ zhuge’ 记录的主键 id
- 重复 3、4 直到不满足 name = ‘ zhuge’
- 对 sort_buffer 中的字段 position 和主键 id 按照字段 position 进行排序
- 遍历排序好的 id 和字段 position,按照 id 的值回到原表中取出 所有字段的值返回给客户端
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿鑫的博客ッ!
评论


