MySQL排序算法

一、全字段排序(单路排序)

1、初始化sort_buffer,放入查询的全部字段;
2、逐行从符合过滤条件的数据行中取出查询字段,存入sort_buffer;
3、对sort_buffer中的数据按照排序字段做快速排序
4、按照排序结果取出limit n行返回给客户端

优点: 查询快,执行过程简单
缺点: 单行大的话占用内存空间多

读取查询需要的所有列,按照order by 列对他们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为需要把每一行都保存在内存中

二、rowid排序(双路排序)

如果排序字段的总大小超过max_length_for_sort_data,则会使用rowid排序。
执行流程如下:
1、初始化sort_buffer,确定放入排序字段;
2、逐行从符合过滤条件的数据行中取出排序字段,存入sort_buffer;
3、对sort_buffer中的数据按排序字段进行排序
7、遍历排序结果,取出limit n行,并按照主键值回到原表中取出查询字段返回给客户端

优点: 所需的空间更小
缺点: 会产生更多次数的回表查询,查询可能会慢一些

rowid排序的开销可能会非常巨大,因为他会读取表两次,第二次读取会引发大量的随机IO


版权声明:本文为qq_42979842原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。