索引研究:(三)mysql中的排序算法 - filesort

索引研究:(三)mysql中的排序算法 - filesort

当mysql不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序;

如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合成有序的结果集(实际上就是外排序,使用临时表)。

对于filesort,mysql有两种排序算法:

二次扫描算法(two passes)

先将需要排序的字段和可以直接定位到相关行数据的指针信息取出,然后在设定的内存(通过参数 sort_buffer_size设定)中进行排序,完成排序之后再次通过行指针信息取出所需的Columns。

该算法是MySql 4.1之前采用的算法,他需要两次访问数据,尤其是第二次读取操作会造成大量的随机I/0操作。另一方面,内存开销较小。

一次扫描算法(single pass)

该算法一次性将所需的Columns全部取出,在内存中排序后直接将结果输出。

从MySql4.1版本中开始使用该算法。他见少了I/0次数,效率高,但是内存开销也较大。如果我们将并不需要的Columns也取出来,就会极大的浪费排序过程所需要的内存。

在MySql 4.1之后的版本,可以通过设置max_length_for_sort_data参数来控制MySql选择第一种排序算法还是第二种:当取出的所有大字段总大于max_length_for_sort_data的设置时,MySql就会选择使用第一种排序算法,反之则会使用第二种。

当对连接操作进行排序的时候,如果ORDER BY仅仅引用第一个表的列,MySql对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySql必须将查询的结果集生成一个临时表,在连接完成之后进行filesort操作,此时EXPLAIN输出“Using temporary;Using filesort”。

为了尽可能地提高排序性能,我们更加希望使用第二种排序算法,所以在Query中仅仅取出需要的Columns是非常有必要的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值