51CTO首页
AI.x社区
博客
学堂
精品班
直播训练营
企业培训
鸿蒙开发者社区
WOT技术大会
AIGC创新中国行
IT证书
公众号矩阵
移动端

MySQL排序工作原理

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

MySQL的 order by 工作原理

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

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

  1. CREATE TABLE `user_info` ( 
  2.  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID'
  3.  `city` varchar(16) NOT NULL COMMENT '城市'
  4.  `namevarchar(16) NOT NULL COMMENT '姓名'
  5.  `age` int(11) NOT NULL COMMENT '年龄'
  6.  `addr` varchar(128) DEFAULT NULL COMMENT '地址'
  7.  PRIMARY KEY (`id`), 
  8.  KEY `city` (`city`) 
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

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

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

全字段排序

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

MySQL的 order by 工作原理

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

MySQL的 order by 工作原理

执行流程如下:

  1. 初始化 sort_buffer,确定放入 city name age 这 3 个字段;
  2. 从 city 索引中获取到***个 city='上海' 的记录,也就是 id_x;
  3. 到主键索引中获取对应的记录,并取出 name city age 的值放入 sort_buffer;
  4. 取下一条符合条件的记录,重复 3 4 的操作,直至不符合条件为止;
  5. 对 sort_buffer 中的数据按照 name 做快速排序;
  6. 取出前 1000 条数据并返回。

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

MySQL的 order by 工作原理

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

rowid 排序

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

  1. SET max_length_for_sort_data=16; 

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

  1. 初始化 sort_buffer,确定放入 name id 这 2 个字段;
  2. 从 city 索引中获取到***个 city='上海' 的记录,也就是 id_x;
  3. 到主键索引中获取对应的记录,并取出 name id 的值放入 sort_buffer;
  4. 取下一条符合条件的记录,重复 3 4 的操作,直至不符合条件为止;
  5. 对 sort_buffer 中的数据按照 name 做快速排序;
  6. 取出前 1000 条数据,然后根据 id 取出对应记录的 name city age 3 个字段并返回结果。

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

MySQL的 order by 工作原理

全字段排序 VS rowid 排序

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

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

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

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

MySQL的 order by 工作原理

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

  1. 从 (city, name)索引中获取到***个 city='上海' 的记录 id_x;
  2. 到主键索引中获取对应的记录,并取出 name city age 的值作为结果集的一部分直接返回;
  3. 取下一条符合条件的记录,重复 2 3 的操作,直至不符合条件或者达到 1000 条为止;

MySQL的 order by 工作原理

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

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

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

  1. 从 (city, name,age)索引中获取到***个 city='上海' 的记录,并取出 name city age 的值作为结果集的一部分直接返回;
  2. 取下一条符合条件的记录,重复 1 2 的操作,直至不符合条件或者达到 1000 条为止;

MySQL的 order by 工作原理

 

责任编辑:庞桂玉 来源: 今天头条
相关推荐
MySQL查询优化器的工作原理
MySQL如何提高查询效率是每一个DBA都经常要思考的问题,而查询优化器正是帮助我们解决此问题的有力武器。

2010-11-25 10:28:28

MySQL查询优化器
通过MySQL存储原理来分析排序和锁
对于MySQL数据库而言,数据是存储在文件里的,而为了能够快速定位到某张表里的某条记录进行查询和修改,我们需要将这些数据以一定的数据结构进行存储,这个数据结构就是我们说的索引。回忆一下我们大学里学过的算法与数据结构,能够支持快速查找的数据结构有:顺序数组、哈希、搜索树。

2019-04-29 11:14:25

MySQL 存储 排序
Spring工作原理
本文介绍Spring工作原理,以及IoC(Inversionofcontrol):控制反转和AOP(AspectOrientedProgramming):面向方面编程。

2009-06-18 13:31:03

Spring工作原理
SSL工作原理
SSL是一个安全协议,它提供使用TCPIP的通信应用程序间的隐私与完整性。因特网的超文本传输协议(HTTP)使用SSL来实现安全的通信。

2009-08-14 13:19:23

iBATIS工作原理浅析
iBATIS工作原理是什么呢?iBATIS在不同的系统中的角色是什么呢?那么本文将会向你介绍这方面的信息。

2009-07-16 10:23:30

iBATIS工作原理
Spring工作原理探秘
本文和您一起探秘Spring工作原理,进入Spring的核心部分,细看Spring这种采用动态的、灵活的方式来设计框架如何运作的。

2009-06-15 15:57:21

Spring工作原理
解读GitOps工作原理
本文将介绍GitOps的工作原理,它的启动与运行,以及如何在Kubernetes中配合使用GitOps,以团队的DevOps体验。

2020-06-15 07:00:00

GitOps Kubernetes DevOps
图解Git工作原理
本文图解Git中的最常用命令。如果你稍微理解Git的工作原理,这篇文章能够让你理解的更透彻。

2021-02-05 15:01:41

Git Linux 命令
浅谈DHCP工作原理
接受IP租约、寻找Server、提供IP租用地址。这三个方面是DHCP工作原理的主要方面。那么下面我们就来详细了解一下吧。

2010-09-25 13:11:48

DHCP工作原理
DHCP工作原理知多少?
文章摘要:下面我们针对DHCP工作原理的内容进行了讲解。DHCP是一个非常有用的协议,在IP管理方面有着强大的管理功能。

2010-09-29 09:28:04

DHCP工作原理
JSP引擎的工作原理
本文介绍JSP引擎的工作原理,以及JSP运行环境,JSP生命周期和JSP网络应用服务器框架等。

2009-07-06 12:32:26

JSP引擎
ICMP协议的工作原理
文章摘要:下面我们来对ICMP协议的一些具体内容进行一下分析和讲解。首先我们需要对ICMP协议的具体工作内容了解一下。

2010-08-02 16:14:54

JavaScript原型继承工作原理
这篇文章原是出自著名的前端博主阮一峰一篇关于JS原型继承的文章:Javascript继承机制的设计思想中的引用。这篇文章对于原型继承讲解详细,令人读之有拨云见日之感

2013-09-18 14:01:46

JavaScript
OSPF协议的工作原理
OSPF路由协议是一种典型的链路状态(Linkstate)的路由协议,一般用于同一个路由域内。在这里,路由域是指一个自治系统(AutonomousSystem),即AS,它是指一组通过统一的路由政策或路由协议互相交换路由信息的网络

2013-06-04 13:53:30

OSPF路由协议 OSPF协议 OSPF
理解 HTTPS 的工作原理
HTTPS,也称作HTTPoverTLS。TLS的前身是SSL,TLS1.0通常被标示为SSL3.1,TLS1.1为SSL3.2,TLS1.2为SSL3.3。本文着重描述TLS协议的1.2版本。

2019-08-20 14:01:22

HTTPS SSL 协议
Nagios网络监控工作原理
Nagios是LinuxUnix平台常用的监控系统,能让我们放心的知道网络与系统运行的情况,以便监控和快速的处理问题。Nagios的主要功能还是网络监控,本文就围绕Nagios网络监控来给大家解析下它的工作原理和操作过程!

2011-03-25 09:34:34

Nagios 网络监控
SMTP工作原理大剖析
简单邮件传输协议(SMTP)以可靠且高效的方式传输邮件。要使SMTP应用程序正常工作,邮件的格式必须正确,并且客户端和服务器上均运行SMTP进程。

2020-09-16 10:31:58

SMTP 网络 电子邮件
Java Servlet 工作原理问答
本文来自stackoverflow的问答,讨论了JavaServlet的工作机制,如何进行实例化、共享变量和多线程处理。

2015-11-04 09:23:17

Java Servlet 工作原理
Unix Tripwire的工作原理
在文章中,我们可以知道,当怀疑系统被入侵时,可由UnixTripwire根据先前生成的,数据库文件来做一次数字签名的对照。

2010-05-05 16:47:57

Unix Tripwi
扫盲:DHCP的工作原理
这篇文章依然是针对刚刚接触网络的朋友,通过本文,您可以了解到DHCP的工作原理,以便您能够更好的阅读本专题。

2009-08-27 17:13:20

DHCP的工作原理

深圳SEO优化公司广安网站推广恩施企业网站设计报价塔城SEO按效果付费推荐海口网页设计济南seo排名多少钱赣州网页制作推荐西乡外贸网站建设公司惠州网站推广系统哪家好兰州网站优化按天扣费公司吉林网络营销哪家好西乡企业网站建设报价广元模板推广朔州营销型网站建设多少钱吉林网站制作设计公司玉林百度网站优化多少钱西安网站设计报价天津百姓网标王多少钱安顺seo网站推广价格吴忠网站定制哪家好文山营销网站公司武威优化公司榆林外贸网站设计价格晋城如何制作网站多少钱抚顺seo优化梅州模板网站建设推荐海南网站优化推广多少钱哈尔滨品牌网站设计丽江网站改版推荐合肥英文网站建设价格龙华设计网站公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化