百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> mysql排序区别
分享文章到:

mysql排序区别

发布时间:08/01 来源:未知 浏览: 关键词:
MySQL内部实现排序主要有3种方式,通例排序,优化排序和优先队列排序。通例排序方式除了排序自身,还需要额外两次IO。优化的排序方式相关于通例排序,减少了第二次IO。优先队列排序,这种方式采纳堆排序实现。 由浅入深细致说说MySQL排序模式,怎么影响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排序区另外细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板