千家信息网

mysql排序的有什么区别

发表于:2025-01-30 作者:千家信息网编辑
千家信息网最后更新 2025年01月30日,这篇文章将为大家详细讲解有关mysql排序的有什么区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。排序是数据库中的一个基本功能,MySQL也不例外。用户通过Ord
千家信息网最后更新 2025年01月30日mysql排序的有什么区别

这篇文章将为大家详细讲解有关mysql排序的有什么区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

排序是数据库中的一个基本功能,MySQL也不例外。

用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序。本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部原理。

解决大家的以下疑问:

MySQL在哪些地方会使用排序,怎么判断MySQL使用了排序;

MySQL有几种排序模式,通过什么方法让MySQL选择不同的排序模式;

MySQL排序跟read_rnd_buffer_size有啥关系,在哪些情况下增加read_rnd_buffer_size能优化排序;

怎么判断MySQL使用到了磁盘来排序,怎么避免或者优化磁盘排序;

排序时变长字段(varchar)数据在内存是怎么存储的,5.7有哪些改进;

在情况下,排序模式有哪些改进;

sort_merge_pass到底是什么 ,该状态值过大说明了什么问题,可以通过什么方法解决;

MySQL使用到了排序的话,依次可以通过什么办法分析和优化让排序更快?

二、排序

我们通过explain查看MySQL执行计划时,经常会看到在Extra列中显示Using filesort。

对于不能利用索引避免排序的SQL,数据库不得不自己实现排序功能以满足用户需求,此时SQL的执行计划中会出现"Using filesort",这里需要注意的是filesort并不意味着就是文件排序,其实也有可能是内存排序,这个主要由sort_buffer_size参数与结果集大小确定。

其实这种情况就说明MySQL使用了排序。Using filesort经常出现在order by、group by、distinct、join等情况下。

MySQL内部实现排序主要有3种方式,常规排序,优化排序和优先队列排序。

CREATE TABLE t1(id int, col1 varchar(64), col2 varchar(64), col3 varchar(64), PRIMARY KEY(id),key(col1,col2));SELECT col1,col2,col3 FROM t1 WHERE col1>100 ORDER BY col2;

请看这三种排序的区别:

a.常规排序

(1).从表t1中获取满足WHERE条件的记录

(2).对于每条记录,将记录的主键+排序键(id,col2)取出放入sort buffer

(3).如果sort buffer可以存放所有满足条件的(id,col2)对,则进行排序;否则sort buffer满后,进行排序并固化到临时文件中。(排序算法采用的是快速排序算法)

(4).若排序中产生了临时文件,需要利用归并排序算法,保证临时文件中记录是有序的

(5).循环执行上述过程,直到所有满足条件的记录全部参与排序

(6).扫描排好序的(id,col2)对,并利用id去捞取SELECT需要返回的列(col1,col2,col3)

(7).将获取的结果集返回给用户。

从上述流程来看,是否使用文件排序主要看sort buffer是否能容下需要排序的(id,col2)对,这个buffer的大小由sort_buffer_size参数控制。此外一次排序需要两次IO,一次是捞(id,col2),第二次是捞(col1,col2,col3),由于返回的结果集是按col2排序,因此id是乱序的,通过乱序的id去捞(col1,col2,col3)时会产生大量的随机IO。对于第二次MySQL本身一个优化,即在捞之前首先将id排序,并放入缓冲区,这个缓存区大小由参数read_rnd_buffer_size控制,然后有序去捞记录,将随机IO转为顺序IO。

b.优化排序

常规排序方式除了排序本身,还需要额外两次IO。优化的排序方式相对于常规排序,减少了第二次IO。主要区别在于,放入sort buffer不是(id,col2),而是(col1,col2,col3)。由于sort buffer中包含了查询需要的所有字段,因此排序完成后可以直接返回,无需二次捞数据。这种方式的代价在于,同样大小的sort buffer,能存放的(col1,col2,col3)数目要小于(id,col2),如果sort buffer不够大,可能导致需要写临时文件,造成额外的IO。当然MySQL提供了参数max_length_for_sort_data,只有当排序元组小于max_length_for_sort_data时,才能利用优化排序方式,否则只能用常规排序方式。

c.优先队列排序

为了得到最终的排序结果,无论怎样,我们都需要将所有满足条件的记录进行排序才能返回。那么相对于优化排序方式,是否还有优化空间呢?5.6版本针对Order by limit M,N语句,在空间层面做了优化,加入了一种新的排序方式--优先队列,这种方式采用堆排序实现。堆排序算法特征正好可以解limit M,N 这类排序的问题,虽然仍然需要所有元素参与排序,但是只需要M+N个元组的sort buffer空间即可,对于M,N很小的场景,基本不会因为sort buffer不够而导致需要临时文件进行归并排序的问题。对于升序,采用大顶堆,最终堆中的元素组成了最小的N个元素,对于降序,采用小顶堆,最终堆中的元素组成了最大的N的元素。

关于mysql排序的有什么区别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

排序 方式 文件 元素 常规 结果 语句 参数 大小 情况 数据 条件 算法 模式 用户 空间 问题 队列 有序 不够 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 学校网络安全防范方案 汇川服务器报警如何复位 数据库和建站程序的区别 服务器管理器开启不启动不了 u8不能连接到数据服务器请检查 硕鼠数据库 关于网络安全情况的汇报 数据库密钥怎么解 我的世界启动服务器只有两行命令 无锡311软件开发集团公司 振动测点数据库建立 戴尔服务器风扇声音怎么解决 倡导绿色阅读网络安全讲座 数据库第四章课后题名词解释答案 网联天下网络技术有限公司 服务器关闭禁ping命令 王者可以注册两个服务器吗 工业软件开发的基金有哪些 万达网络安全系统 网络安全问题带来的社会危害 sl数据库撤销MD5 免费服务器ip 中国网络安全攻防大赛 深圳如来网络技术有限公司 贪婪整合包有没有服务器 杭州蒲石网络技术 网络安全工程师几本 崇明区智能化软件开发服务价钱 计算机网络技术双绞线实验 宿州系统软件开发费用
0