我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中排序的原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中排序的原理是什么

MySQL中排序的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在程序设计当中,我们很多场景下都会用 group by 关键字。比如在分页读取数据时,为了避免重复扫描记录,这就是必须要使用 group by 了。

比如我们使用如下 DDL 创建表:

CREATE TABLE `user_info` (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',  `city` varchar(16) NOT NULL COMMENT '城市',  `name` varchar(16) NOT NULL COMMENT '姓名',  `age` int(11) NOT NULL COMMENT '年龄',  `addr` varchar(128) DEFAULT NULL COMMENT '地址',  PRIMARY KEY (`id`),  KEY `city` (`city`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

并且我们会执行如下查询语句

SELECT city,`name`,age FROM user_info WHERE city='上海' ORDER BY `name` LIMIT 1000;

全字段排序

因为上面的建表语句已经在 city 字段上面创建索引了,当我们使用 EXPLAIN 命令时,会有如下结果:

MySQL中排序的原理是什么

上面 Extra 字段中的 “Using filesort” 表示的就是需要排序,MySQL 会为每个线程分配一块内存用于排序,成为 sort_buffer。下面我们看一下 index(city) 的结构示意图。

MySQL中排序的原理是什么

执行流程如下:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 初始化 sort_buffer,确定放入 city name age 这 3 个字段;

  3. 从 city 索引中获取到***个 city='上海' 的记录,也就是 id_x;

  4. 到主键索引中获取对应的记录,并取出 name city age 的值放入 sort_buffer;

  5. 取下一条符合条件的记录,重复 3 4 的操作,直至不符合条件为止;

  6. 对 sort_buffer 中的数据按照 name 做快速排序;

  7. 取出前 1000 条数据并返回。

我们暂时叫这种排序过程为“全字段排序”,如下所示:

MySQL中排序的原理是什么

图中的“按  name 排序” 可能在内存中,也可能使用磁盘文件排序,这取决与排序所需要的内存和 sort_buffer_size  。sort_buffer_size 就是 MySQL 为排序开辟的内存大小,当所需内存小于 sort_buffer_size  时,就直接在内存中完成排序,如果所需要的内存 大于 sort_buffer_size ,就需要额外的磁盘空间辅助排序。

rowid 排序

上面的算法在数据量比较大的时候,可能会出现一些问题。因为在排序的时候,存放了所有的返回字段,增加了 排序空间 (sort_buffer)的压力。

SET max_length_for_sort_data=16;

max_length_for_sort_data  是MySQL 限制排序行大小的参数。意思是,如果排序行大小超过了这个值,就会另选排序算法。上面 name city age 3 个字段的大小为  36,大于 16 ,在新的算法中将只有 name (排序字段) 和id 参与 sort_buffer 中的排序。过程如下

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 初始化 sort_buffer,确定放入 name id 这 2 个字段;

  3. 从 city 索引中获取到***个 city='上海' 的记录,也就是 id_x;

  4. 到主键索引中获取对应的记录,并取出 name id 的值放入 sort_buffer;

  5. 取下一条符合条件的记录,重复 3 4 的操作,直至不符合条件为止;

  6. 对 sort_buffer 中的数据按照 name 做快速排序;

  7. 取出前 1000 条数据,然后根据 id 取出对应记录的 name city age 3 个字段并返回结果。

这种排序过程,我们称为 rowid 排序,过程如下所示:

MySQL中排序的原理是什么

全字段排序 VS rowid 排序

从上面  2 个流程看来,如果内存足够时,MySQL 会让返回值中所有字段存放在排序空间。当MySQL 内存过小时,才会考虑使用rowid  排序。但是从上面的流程看来,rowid 排序在返回结果前,还会再一次的回表。因此MySQL 认为内存充足的时候,会优先采用 全字段排序。

上面的场景是:city 字段过滤后,name 字段不是有序的。其实我们可以通过联合索引来规避掉 name 字段的排序。

alter table user_info add index idx_city_user(city, name);

下面我们看一下联合索引的示意图:

MySQL中排序的原理是什么

从上面流程图可以看出,当我们取出 city='上海' 的记录时,name的字段也是有序的。过程如下

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 从 (city, name)索引中获取到***个 city='上海' 的记录 id_x;

  3. 到主键索引中获取对应的记录,并取出 name city age 的值作为结果集的一部分直接返回;

  4. 取下一条符合条件的记录,重复 2 3 的操作,直至不符合条件或者达到 1000 条为止;

MySQL中排序的原理是什么

从联合索引看来,我们是可以不用排序操作了,那么我们是否可以直接通过 索引就直接返回结果呢?也就是不要回表操作。答案是有的,那就是覆盖索引。

alter table user_info add index idx_city_user_age(city, name, age);

当执行查询语句时,不仅 name 中的字段是有序的,并且 索引中已经包含了结果集中的所有字段,过程如下:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 从 (city, name,age)索引中获取到***个 city='上海' 的记录,并取出 name city age 的值作为结果集的一部分直接返回;

  3. 取下一条符合条件的记录,重复 1 2 的操作,直至不符合条件或者达到 1000 条为止;

MySQL中排序的原理是什么

关于MySQL中排序的原理是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中排序的原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中order by排序语句的原理是什么

本文小编为大家详细介绍“MySQL中order by排序语句的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL中order by排序语句的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-07-04

php中冒泡排序的原理是什么

php中冒泡排序的原理是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、P
2023-06-14

python中希尔排序的原理是什么

python中希尔排序的原理是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,
2023-06-14

python中归并排序的原理是什么

本篇文章给大家分享的是有关python中归并排序的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、基本思路归纳排序是采用分治法的非常典型的应用。归并排序的思想是先归
2023-06-15

php中快速排序的原理是什么

php中快速排序的原理是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Per
2023-06-14

php中插入排序的原理是什么

php中插入排序的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、
2023-06-14

php中选择排序的原理是什么

本篇文章为大家展示了php中选择排序的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.原理在一组数据中,选出最小的数与第一个位置交换然后在剩下的数据中在找出最小的数和第二个位置交换然后在
2023-06-14

redis的zset排序原理是什么

Redis的有序集合(Sorted Set)是一种特殊类型的数据结构,它是一个无序的字符串集合,同时每个字符串都关联着一个浮点数值,称为分数(score)。有序集合中的元素是唯一的,但是分数可以重复。有序集合使用分数来对集合中的元素进行排
2023-10-23

堆排序的实现原理是什么

本篇文章给大家分享的是有关堆排序的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。对于堆排序会涉及一些完全二叉树知识。对于待排序列{10, 2, 11, 8, 7}
2023-05-31

Java排序函数的实现原理是什么

Java中的排序函数的实现原理依赖于具体的排序算法。Java提供了多种排序算法的实现,其中包括快速排序、归并排序、插入排序等。快速排序是一种基于分治法的排序算法。它的原理是通过选择一个基准元素,将待排序的序列分成两个子序列,其中一个子序列中
2023-09-27

excel排序排不了的原因是什么

本篇内容介绍了“excel排序排不了的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!excel排序排不了的原因:一、选择范围1、排
2023-07-02

MySQL 表中的默认排序顺序是什么?

MySQL 表中的默认排序顺序是升序。每当我们使用 ORDER BY 子句对表中的行进行排序时,MySQL 都会按升序给出输出,最小值在前。考虑以下来自名为“student”的表的示例 -mysql> Select * from stude
2023-10-22

mysql中utf8mb4的排序规则是什么

在MySQL中,UTF8MB4排序规则是根据Unicode字符集定义的。Unicode定义了每个字符的排序顺序,根据字符的Unicode码点来确定其在排序中的位置。UTF8MB4字符集支持Unicode字符集中的所有字符,包括emoji表情
mysql中utf8mb4的排序规则是什么
2024-04-09

MySQL的排序规则是什么

MySQL的排序规则是根据指定的排序规则来确定查询结果的排序方式。MySQL支持多种排序规则,包括字母数字顺序、大小写敏感或不敏感、特定语言的排序等。在ORDER BY子句中,可以使用COLLATE子句来指定排序规则。常见的排序规则包括:1
2023-09-21

Mysql排序的特性是什么

本篇内容主要讲解“Mysql排序的特性是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql排序的特性是什么”吧!1、问题场景新上线一个交易记录导出功能,逻辑很简单:根据查询条件,导出对
2023-06-25

详解MySQL中Order By排序和filesort排序的原理及实现

目录1.Order By原理2.filesort排序算法3.优化排序1.Order By原理mysql的Order By操作用于排序,并且会有多种不同的排序算法,他们的性能都是不一样的。假设有一个表,建表的sql如下:CREATE T
2022-08-16

编程热搜

目录