首页 > 其他分享 >“order by”是怎么工作的?

“order by”是怎么工作的?

时间:2024-09-29 17:22:05浏览次数:7  
标签:怎么 sort name city buffer id 工作 排序 order

在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。

假设这个表的部分定义是这样的:

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `city` varchar(16) NOT NULL,
  `name` varchar(16) NOT NULL,
  `age` int(11) NOT NULL,
  `addr` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB;

 这时,你的SQL语句可以这么写:

select city,name,age from t where city='杭州' order by name limit 1000  ;

为避免全表扫描,我们需要在city字段加上索引。

在city字段上创建索引之后,我们用explain命令来看看这个语句的执行情况。

 可以看到 Extra这个字段中的“Using filesort”表示的就是需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。

Extra这个字段中的“Using filesort”表示的就是需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。

从图中可以看到,满足city='杭州’条件的行,是从ID_X到ID_(X+N)的这些记录。

通常情况下,这个语句执行流程如下所示 :

  1. 初始化sort_buffer,确定放入name、city、age这三个字段;

  2. 从索引city找到第一个满足city='杭州’条件的主键id,也就是图中的ID_X;

  3. 到主键id索引取出整行,取name、city、age三个字段的值,存入sort_buffer中;

  4. 从索引city取下一个记录的主键id;

  5. 重复步骤3、4直到city的值不满足查询条件为止,对应的主键id也就是图中的ID_Y;

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

  7. 按照排序结果取前1000行返回给客户端。

我们暂且把这个排序过程,称为全字段排序。

全字段排序定义:全字段排序通常是指在执行ORDER BY操作时,如果无法使用索引进行排序(例如,排序依据包含了未建立合适索引的列,或者排序涉及多个索引无法合并使用时),MySQL需要将满足条件的行的相关信息读入到sort_buffer中进行排序。

按name排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数sort_buffer_size。

sort_buffer_size,就是MySQL为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。

在上面这个算法过程里面,只对原表的数据读了一遍,剩下的操作都是在sort_buffer和临时文件中执行的。但这个算法有一个问题,就是如果查询要返回的字段很多的话,那么sort_buffer里面要放的字段数太多,这样内存里能够同时放下的行数很少,要分成很多个临时文件,排序的性能会很差。

所以如果单行很大,这个方法效率不够好。

那么,如果MySQL认为排序的单行长度太大会怎么做呢?

接下来,我来修改一个参数,让MySQL采用另外一种算法。

SET max_length_for_sort_data = 16;

max_length_for_sort_data,是MySQL中专门控制用于排序的行数据的长度的一个参数。它的意思是,如果单行的长度超过这个值,MySQL就认为单行太大,要换一个算法。

city、name、age 这三个字段的定义总长度是36,我把max_length_for_sort_data设置为16,我们再来看看计算过程有什么改变。

新的算法放入sort_buffer的字段,只有要排序的列(即name字段)和主键id。

但这时,排序的结果就因为少了city和age字段的值,不能直接返回了,整个执行流程就变成如下所示的样子:

  1. 初始化sort_buffer,确定放入两个字段,即name和id;

  2. 从索引city找到第一个满足city='杭州’条件的主键id,也就是图中的ID_X;

  3. 到主键id索引取出整行,取name、id这两个字段,存入sort_buffer中;

  4. 从索引city取下一个记录的主键id;

  5. 重复步骤3、4直到不满足city='杭州’条件为止,也就是图中的ID_Y;

  6. 对sort_buffer中的数据按照字段name进行排序;

  7. 遍历排序结果,取前1000行,并按照id的值回到原表中取出city、name和age三个字段返回给客户端。

这个执行流程的示意图如下,我把它称为rowid排序。

我们来分析一下,从这两个执行流程里,还能得出什么结论。

如果MySQL实在是担心排序内存太小,会影响排序效率,才会采用rowid排序算法,这样排序过程中一次可以排序更多行,但是需要再回到原表去取数据。

如果MySQL认为内存足够大,会优先选择全字段排序,把需要的字段都放到sort_buffer中,这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。

这也就体现了MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。

对于InnoDB表来说,rowid排序会要求回表多造成磁盘读,因此不会被优先选择。

标签:怎么,sort,name,city,buffer,id,工作,排序,order
From: https://blog.csdn.net/huangyujun9920123/article/details/142637538

相关文章

  • RAID工作模式
    RAID维基百科,自由的百科全书独立磁盘冗余数组(RAID, Redundant Arrayof Independent Disks),旧称廉价磁盘冗余数组(RAID, Redundant Arrayof InexpensiveDisks),简称硬盘阵列。其基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格......
  • 能监控员工电脑的软件怎么选?这10款软件是必备之选,速来看看
    能够监控员工电脑的软件多种多样,这些软件通常具备实时屏幕监控、文件操作记录、网络行为监控等功能,旨在帮助企业提高管理效率、保障数据安全。以下是一些备受推崇的监控员工电脑的软件:1.域智盾软件功能特点:实时捕捉员工的屏幕活动,包括网页浏览、程序使用、聊天记录、文件......
  • 怎么判断公司电脑是否被监控?分享五种小技巧!
    判断公司电脑是否被监控通常涉及多个方面,包括网络流量、进程监控、系统配置等。为了确认电脑是否被监控,以下是一些常见的方法和提示:一、检查是否安装了监控软件公司通常会使用监控软件来跟踪员工的活动,如屏幕录制、操作记录、网络活动跟踪等。可以通过检查电脑上的已安装程......
  • PbootCMS后台登录验证码不显示怎么回事?
    在PbootCMS后台登录时,如果验证码不显示,可能有几种原因。以下是一些常见的故障排查方法和解决方案:故障排查与解决方案1.检查浏览器设置清除缓存和Cookies:清除浏览器缓存和Cookies,尝试重新登录。禁用浏览器插件:禁用浏览器中的广告拦截插件或其他可能影响显示的插件,如A......
  • PbootCMS后台登录验证码有数值,但是看不清是怎么回事?
    当PbootCMS后台登录验证码在某些PHP版本下显示不清楚时,通常是因为PHP版本不兼容导致的。验证码背景图黑色和文字颜色深色相冲也会导致这个问题。以下是详细的解决方法:原因分析验证码背景图黑色和文字颜色深色相冲,导致验证码难以看清。这通常是由于PHP版本不兼容造成的。解决方......
  • Java毕业设计:基于Springboo咖啡厅座位预约网站毕业设计源代码作品和开题报告怎么写
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • (三)项目准备工作
    前言:虽然Ignition可以在不做任何配置的情况下直接使用,但为了方便以后的操作,我们先准备好数据库,配置网关1.下载MySQL数据库与jar驱动包 2.安装MySQL数据库 3.配置MySQL数据库配置root密码P@ssw0rd,之后会自动打开MySQLBench选择默认连接,填入刚才设置的密码即可连......
  • 期刊投稿|投稿前做什么准备工作(文件和信息)
    投稿前,事先准备好所有可能需要的投稿信息,确保整个投稿过程的稳妥顺利进行。(以下是一些常见信息)论文源文件*:不仅要PDF文件,还要整个可编辑的项目(.tex/.doc文件,以及所有附带的配置文件.bib/.bbl/.bst/.sty/.cls、图片表格文件)论文信息*:题目、摘要、关键词论文主题:可以参考期刊官......
  • 工作繁杂,如何防止工作遗漏遗忘?
    来源:tita.com不知道大家工作中是否有这样的情况:1.工作过程中工作任务经常被打断,打乱正常的工作节奏;2.因为不方便统一记录工作及工作要求,经常忘记给领导反馈工作进展;3.因为工作繁多,经常会出现工作遗漏遗忘的现象。……如果你的工作计划出现了这样的问题,就是在提醒你,你需要马......
  • 计算机毕业设计不会做怎么办?
    博主介绍:✌全网粉丝60W+,csdn特邀作者、Java领域优质创作者、csdn/掘金/哔哩哔哩/知乎/道客/小红书等平台优质作者,计算机毕设实战导师,目前专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌技术栈范围:SpringBoot、Vue、SSM、Jsp、HLMT、Nodejs......