MySQL中order by是怎么工作的?

图片

在如上图中所示的explain的执行结果中,Extra字段中的“Using filesort”表示的就是需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。

图片

索引city如上图所示

上述语句的执行流程如下:

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_Y;

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

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

上述过程可称之为“全字段排序”

“按name排序”这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数sort_buffer_size。sort_buffer_size是MySQL为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于sort_buffer_size,排序在内存中完成,否则,内存放不下,不得不利用磁盘临时文件辅助排序,称为外部排序,外部排序一般使用归并排序算法。

rowid排序

max_length_for_sort_data参数,是MySQL中专门控制用于排序的行数据长度的一个参数,含意是:如果需要取出来的单行数据的长度超过这个值,MySQL就认为单行太大,要换一个算法。假设city  name  age三个字段的定义总长度是36,把max_length_for_sort_data设置为16,则执行过程变为:

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排序。

全字段排序 VS rowid排序:

综上可得出MySQL的一个设计思想:如果内存足够,就多利用内存,采取全字段排序,尽量减少磁盘访问。

其实,并不是所有的order by语句,都需要排序操作的。比如,如果创建一个city和name的联合索引。

alter table t add index city_user(city, name);

则执行流程变为:

1、从索引(city,name)找到第一个满足city='杭州’条件的主键id;

2、到主键id索引取出整行,取name、city、age三个字段的值,作为结果集的一部分直接返回;

3、从索引(city,name)取下一个记录主键id;

4、重复步骤2、3,直到查到第1000条记录,或者是不满足city='杭州’条件时循环结束。

图片

可以看到Extra字段中没有Using filesort了,也就是不需要排序了。

更进一步优化,还可以采用覆盖索引,即索引上的信息足够满足查询请求,不需要再回到主键索引上去取数据。

alter table t add index city_user_age(city, name, age);

则执行流程变为:

1、从索引(city,name,age)找到第一个满足city='杭州’条件的记录,取出其中的city、name和age这三个字段的值,作为结果集的一部分直接返回;

2、从索引(city,name,age)取下一个记录,同样取出这三个字段的值,作为结果集的一部分直接返回;

3、重复执行步骤2,直到查到第1000条记录,或者是不满足city='杭州’条件时循环结束。

图片

可以看到,Extra里面多了“Using index”,表示的就是使用了覆盖索引,性能上会快很多。

正文止。

感兴趣的朋友,欢迎关注我的公众号哈,公众号上已经集成了AI大模型,大家可以过来聊天、问问题了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/311384.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

由于找不到msvcp140.dll无法继续执行代码原因及解决教程分享

在计算机打开软件过程,我们经常会遇到一些错误提示,其中之一就是“由于找不到msvcp140.dll无法继续执行代码”。这个错误通常发生在使用Microsoft Visual C 2015或更高版本编译的程序运行时。那么,什么是msvcp140.dll文件?为什么会…

竞赛保研 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的行人重识别 该项目较为新颖,适合…

中国社科院大学与美国杜兰大学金融管理硕士项目——熬过寒冬,春日暖阳已不远

在金融领域,寒冬似乎成了无法避免的阶段。然而,对于那些坚守岗位的金融从业者来说,熬过寒冬并非无望。正如冬去春来,只要我们采取明智的策略,迈出坚定的步伐,春日的暖阳已在不远方照耀。社科院与美国杜兰大…

2023检索增强生成技术(RAG)研究进展

一、前言 在过去的一两年里,人工智能领域目睹了检索增强生成技术(RAG)的迅猛发展,这种技术结合了强大的语言模型与信息检索系统,以期在复杂的问题解决和信息处理任务中提供更加精确和深入的答案。正是这种对前沿科技的…

Android通过Recyclerview实现流式布局自适应列数及高度

调用 FlowAdapter 跟普通recyclerview一样使用 RecyclerView rvLayout holder.getView(R.id.spe_tag_layout); FlowAdapter rvAdapter new FlowAdapter(); FlowLayoutManager flowLayoutManager new FlowLayoutManager(); rvLayout.setLayoutManager(flowLayoutManager); r…

二叉树基础oj练习(单值二叉树、相同的树、二叉树的前序遍历)

讲了这么多数据结构相关的知识(可以看我的数据结构文章专栏): 抓紧刷题巩固一下了 目录 1.单值二叉树 题目描述 思路1 代码1 思路2 代码2 2.相同的树 题目描述 思路 代码 3.二叉树的前序遍历 代码 思路 1.单值二叉树 965. 单值二叉树 - 力扣(LeetCod…

Linux网络编程(一-网络相关知识点)

目录 一、网络相关知识简介 二、网络协议的分层模型 2.1 OSI七层模型 2.2 TCP/IP五层模型 2.3 协议层报文间的封装与拆封 三、IP协议 3.1 MAC地址 3.2 IP地址 3.3 MAC地址与IP地址区别 一、网络相关知识简介 互联网通信的本质是数字通信,任何数字通信都离…

Redis命令总结

1、启动Redis服务,登录Redis # 开启redis服务 redis-server redis配置文件路径例子: redis-server redis.windows.conf# 连接redis 【无密码】 redis-cli# 连接redis【有密码】 # 1 先连接再输入密码 redis-cli auth 密码 2、连接时输入 IP址、端口号、…

Handsfree_ros_imu:ROS机器人IMU模块ARHS姿态传感器(A9)Liunx系统Ubuntu20.04学习启动和运行教程

这个是篇学习 Handsfree_ros_imu 传感器的博客记录 官方教程链接见: https://docs.taobotics.com/docs/hfi-imu/ 产品功能 IMU 内有 加速度计,陀螺仪,磁力计这些传感器,通过固定 imu 到物体上后,可以获取物体在运动…

力扣LCR 166. 珠宝的最高价值(java 动态规划)

Problem: LCR 166. 珠宝的最高价值 文章目录 解题思路思路解题方法复杂度Code 解题思路 思路 改题目与本站64题实质上是一样的,该题目在64题的基础上将求取最小路径和改成了求取最大路径和。具体实现思路如下: 1.定义一个int类型的二维数组dp大小为给定…

代码随想录第五十五天——判断子序列,不同的子序列

leetcode 392. 判断子序列 题目链接:判断子序列 确定dp数组及下标的含义 dp[i][j]:以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列长度为dp[i][j]确定递推公式 分为两种情况:s[i - 1] 与t[j - 1]相…

一起学习python类的属性装饰器@property

之前文章我们介绍了class的一些通用功能,比如类属性/类方法/实例属性/实例方法等,之前的属性可以直接修改和访问(设置私有属性,不能直接访问,可通过对象名._[类名][属性名]的方式访问),没有一些权限的控制逻…

049.Python包和模块_虚拟环境超详细讲解

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …

开关电源PFC电路原理详解及matlab仿真

PFC全称“Power Factor Correction”,意为“功率因数校正”。PFC电路即能对功率因数进行校正,或者说能提高功率因数的电路。是开关电源中很常见的电路。 在电学中,功率因数PF指有功功率P(单位w)与视在功率S&#xff08…

动态pv策略和组件

pv和pvc,存储卷: 存储卷: emptyDir 容器内部,随着pod销毁,emptyDir也会消失 不能做数据持久化 hostPath:持久化存储数据 可以和节点上的目录做挂载。pod被销毁了数据还在 NFS:一台机器&am…

centos7下升级openssh9.4p1及openssl1.1.1v版本

背景:客户服务器扫描出一些漏洞,发现和版本有关,漏洞最高的版本是9.3p2,所以我们安装一个openssh9.4p1版本及openssl1.1.1v版本 虽然我们进行了镜像备份,为了安全先安装telnet以防止升级失败无法通过ssh连接服务器 一…

大模型在广告ctr预估中的应用

背景 预训练大模型在ctr预估方面取得了不错的效果,但是应用大模型方面还主要停留在提取离线预训练,然后使用大模型的打分结果或者中间的embedding向量,这种级联的应用方式相对灵活方便。但是这种使用大模型提取特征的方式存在自身的问题&…

无法解析的外部符号 “public: virtual void * __cdecl MyTcpsocket::qt_metaca

问题:严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2001 无法解析的外部符号 "public: virtual void * __cdecl MyTcpsocket::qt_metacast(char const *)" (?qt_metacastMyTcpsocketUEAAPEAXPEBDZ) SmartTool D:\…

[软件工具]pdf多区域OCR识别导出excel工具使用教程

首先我们打开软件,界面如下: 如上图,使用非常简单,步骤如下: (1)选择工具-取模板选择一个pdf文件划定自己需要识别的区域,如果你选择第2页指定区域则软件统一识别所有pdf第2页指定区…