mysql对order by 的实现

 首先,根据解释查询计划,在mysql里对order by的排序可以大致分为两种(explain的extra字段标明),一种是using index,一种是using filesort。

1 using index

在这种排序方式中,我们进行的order by是针对有序索引而言的,不论是主键索引还是普通索引。

也就是说,只要查询的列数据可以直接从索引里面得到,那么就是直接通过索引进行排序。

2 using filesort

在我们所需要的排序数据,不能由索引直接提供的话,那么就通过索引或者全盘扫描取出我们所需要排序的字段以及主键,放入sort buffer(sort buffer是存放于服务器内存,每个线程各有自己的sort buffer),如果sort buffer存放的下,就进行排序,在这个过程中,使用的是快速排序算法

当我们存放不下时,先用快速排序将数据进行排序,将数据放入临时文件,并且最终用归并排序将临时文件与sort buffer合并。最终返回结果集。

3 distinct

distinct关键字的去重实际上就是使用order by去实现的,他会依次检查每一行,如果与前一行相同就丢弃,不同就保留。

特别地,当sql语句使用了group by时,不会通过order by,而是会首先对表进行排序,然后将排序后的表按照每一行的字段值进行分组。在每个分组里,由于这些值都相同,所以在结果集里只需要保留一个值。这样,我们就得到了去重后的结果集。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值