你真的懂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中order by吗

你知道MySQL与MariaDB对子查询中order by的处理的差异吗?

MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序

MySql 你知道 order by 是怎么回事吗? MySql全字段排序与 rowid 排序

oracle 分页 有无order by情况不同吗

PHP MySQL Order By 关键词