栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

你真的懂mysql中order by吗

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

你真的懂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还是要用的;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号