你真的懂mysql中order by吗
Posted 八阿哥克星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的懂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还是要用的;
以上是关于你真的懂mysql中order by吗的主要内容,如果未能解决你的问题,请参考以下文章
你知道MySQL与MariaDB对子查询中order by的处理的差异吗?
MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序