MySQL 排序机制

栏目: 数据库 · 发布时间: 5年前

内容简介:在 MySQL 中经常使用 Order by 对数据进行排序,其实排序这个行为是比较消耗 IO 的过程,有时候需要回表多次才可以完成排序,所以在任何时候都需要对排序的原理要心知肚明。在 MySQL 中排序按照是否使用外部存储可以分为,内存排序和外部排序两种。根据排序所需的字段可以分成 rowid 排序和全字段排序两种。在 MySQL 执行排序的时候会分配一块内存 sort_buffer,MySQL 把需要排序的字段放入这个 sort_buffer 中,让,后在 sort_buffer 执行排序的过程,如果

MySQL 中经常使用 Order by 对数据进行排序,其实 排序 这个行为是比较消耗 IO 的过程,有时候需要回表多次才可以完成排序,所以在任何时候都需要对排序的原理要心知肚明。

在 MySQL 中排序按照是否使用外部存储可以分为,内存排序和外部排序两种。根据排序所需的字段可以分成 rowid 排序和全字段排序两种。

在 MySQL 执行排序的时候会分配一块内存 sort_buffer,MySQL 把需要排序的字段放入这个 sort_buffer 中,让,后在 sort_buffer 执行排序的过程,如果 sort_buffer 大小不够,就要使用外部存储。

一般来说 sort_buffer_size 的大小取决于排序的是使用快排(内存排序)还是归并排序(外部排序)。

MySQL 排序机制

以上的排序过程都是使用全字段进行排序的,但是如果 sort_buffer 不足以存放所有排序字段,那么这时候就需要用到 rowid 排序。

对于 rowid 排序支取 id 和需要排序的字段放入 sort_buffer 中,在 sort_buffer 开始对字段进行排序。根据排序完成后的 id 再回表找到其他字段组合成结果集返回。

MySQL 排序机制

对于 rowid 排序和全字段排序最大差别在于多一次回表的过程,这也是一次 io 消耗过程(不一定是随机读过程)。同时扫描次数 rowid 会多余全字段排序 n 行,这个 n 就是第二次回表过程根据 id 找到的行的数量。

对于 MySQL 来说如果内存够,就要多利用内存,尽量减少磁盘访问,只有分配的内存不够用的时候才会使用 rowid 排序。

那么,这个过程如何优化?我们可以发现优化的地方有两个,一个是排序所消耗的时间,一个是回表再次读取的时间。所以优化就可以根据这两个来。

对于回表这个操作经常和数据量有关系没有什么好办法,一种比较常用的方法就是建立复合索引以减少排序所耗费的时间。如果再 order by 时候字段满足最左匹配原则,那么这时候第一次从表加载到 sort_buffer 中本身就有序的,那么这时候可以直接当做结果返回了,就不需要排序了。

最后,使用 explain 可以分析 SQL 的排序方式:

  • Using index:覆盖索引
  • Using filesort:使用外部排序
  • 没有 Using index 和 Using filesort:使用联合索引

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

菜鸟侦探挑战数据分析

菜鸟侦探挑战数据分析

[日] 石田基广 / 支鹏浩 / 人民邮电出版社 / 2017-1 / 42

本书以小说的形式展开,讲述了主人公俵太从大学文科专业毕业后进入征信所,从零开始学习数据分析的故事。书中以主人公就职的征信所所在的商业街为舞台,选取贴近生活的案例,将平均值、t检验、卡方检验、相关、回归分析、文本挖掘以及时间序列分析等数据分析的基础知识融入到了生动有趣的侦探故事中,讲解由浅入深、寓教于乐,没有深奥的理论和晦涩的术语,同时提供了大量实际数据,使用免费自由软件RStudio引领读者进一步......一起来看看 《菜鸟侦探挑战数据分析》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码