你真的懂mysql中order by吗

在写sql语句查询的时候,很多情况都需要将目标数据按照某个字段进行排序再返回,在sql中通常就用order by来完成排序,那么,mysql内部是如何完成排序的呢,除了order by 之外,还有更好的排序方式吗?

一、order by实现方式

首先,要知道mysql会为每个线程分配一部分内存空间用来专门做排序,名字就叫做“sort_buffer”。

第一种情况:

1、如果目标数据单条记录数据量不大的情况下,mysql会将每行的数据全字段的放到‘sort_buffer’中,如果“sort_buffer”空间不够的话,会从磁盘中建立临时文件帮助做排序

这种情况可以叫做全字段排序

第二种情况:

2、如果目标数据单条记录数据量达到一定阈值的情况下,mysql就会仅将每行的数据的排序字段及主键放到‘sort_buffer’中,如果“sort_buffer”空间不够的话,会从磁盘中建立临时文件帮助做排序。

这种情况就可以叫做rowid排序。rowid排序完成之后,不能直接返回,因为此时只有两个字段,需要拿着主键id再去查一次数据表,所以rowid这种方式的排序要扫描的行数更多

而决定用哪种排序方式的就是max_length_for_sort_data参数,这个参数就是判断单行数据大小是否达到阈值的参数,可以通过设置max_length_for_sort_data来调整这个阈值。

例如:SET max_length_for_sort_data =32;

整个排序的执行流程:

1、初始化sort_buffer,确定用哪种排序方式;

2、查询出目标数据;

3、将目标数据全字段(或者排序字段及主键id)存到sort_buffer(必要的话,还有磁盘的临时文件)中;

4、对sort_buffer中的数据按照排序字段进行快速排序;

5、返回结果集(全字段排序);

5、遍历排序结果,并按照主键id的值回到原表中取出全字段数据返回;(rowid排序)

二、代替order by的方式

由上可知,排序是一个成本较高的操作,可能还会涉及到磁盘访问,那有没有一种更加搞笑的排序呢?当然有,还记得联合索引吗,联合索引在建立的时候,就已经做好了排序;比如name_age联合索引,在同一个name下,age的值就一定是排列有序的,因此就可以通过这个特点来进行一些sql上的优化,不过,这种情况并不多见,该用order by还是要用的;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值