Mysql 排序实现

查询语句中有大量的order by操作,它却是一个非常耗时的一个操作。
同样group by 也需要进行排序。

Mysql中有两类方式进行排序:

第一种:使用range, ref,index读写方式,explain的输出range,ref,index是描述对索引列的读取方式,这种方式获取的输出都是按照索引列的顺序排列的,这种方式读取后,不需要进行排序操作(Mysql 6.0 版本中MyISAM和InnoDB使用多段读取(MRR)的方式,使得性能上有较大提高,但由于并没有成熟算法去按照索引进行排序,所以将被关闭)

第二种:使用filesort排序方法,简单来说,它是将一组记录后元组按照快速排序算法放入到内存缓存中,然后这几个内存缓存按合并算法排序,并且该算法能够使用的内存参数由系统参数@@sort_buffer_size控制,若被排序数据大于该参数,则使用一个临时表来存放数据,但这样导致性能下降。

filesort的数据通常来自一个表,但如果数据来自多个表,系统首先会将多个表中的数据放在临时表中,再使用filesort对它进行排序。

filesort工作模式有两种:
(1)直接模式:将要求排序的数据完全读取

(2)指针模式:排序时,数据或临时表以<sort_key,rowid>形式存
在,按sort_key 排序后,根据rowid找到数据记录,最后读取我们所需要的数据,结果排序后,包含的所有列是我们需要的列。

MySQL尽可能使用直接模式,只有当被排序的记录包含Blob等变长字段时,才使用指针模式

对于带order by和group by的join操作中,MySQL可能执行的顺序有三种办法:
<1>使用已排序索引(表join操作中的第一个表有索引且索引就是order by的某一列,且order by的其他字段也包含在其他表中)
<2>在单表上使用filesort(使用的order by列均在join操作的第一个表上)
<3>将join结构先放入临时表,然后使用filesort

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值