MySQL 查询语句是怎么执行的(总结篇)?

一条 SQL 查询语句是如何执行的(MySQL) 整个 MySQL 架构分为与。 阅读详情

经过一周的持续整理与总结,终于完成了一条简单查询语句执行过程各个阶段分析的文章。写文章的过程,既是分享输出,也是重新学习的过程。

在这个过程中,也有不小的收获,自己知道和写出来让大家都知道,这个知识转换输出的过程,并不是件容易的事,需要对知识点有更深刻的理解。研究源码时以为自己已经理解的一些知识点,在写文章的过程中,发现并不能清楚的写出来,这时候又继续回头去研究源码,对于这类知识点又有了更深刻的理解。

也感谢同事、朋友们帮忙转发,传播文章,第一次体验到自己写的东西有人在看,这种感觉也是不错的,虽然现在看的人还少,我也会持续输出,一方面是提升自己,另一方面也希望给有需要的小伙伴带来一些帮助。

由于查询语句执行过程涉及的环节比较多,整个执行过程拆分为 6 篇进行介绍,为了小伙伴们对执行过程有个整体的了解,有必要对每篇文章中的内容做一个概括性总结。

1. 词法分析 & 语法分析 <- 点击阅读

第 1 篇,先介绍了 MySQL 的词法分析器是自己实现的,并没有使用开源工具,猜测主要是因为开源的词法分析器要兼顾通用性,不如自己实现执行效率高。

然后介绍了 MySQL 语法分析器使用了开源工具 Bison,因为语法分析器相比于词法分析器来说,没有那么多复杂的逻辑,主要都是针对语法的处理,所以用开源工具实现不涉及到执行效率问题,践行了不重复发明轮子的理念。

最后介绍了在词法分析 & 语法分析过程中,会初始化 select 子句中的字段为 Item_field 类实例,初始化 from 子句中的表为 TABLE_LIST 类实例,初始化 where 条件中的字段为 Item_field 类实例。

2. 查询准备阶段 <- 点击阅读

第 2 篇,先介绍了打开表的过程,涉及到表缓存(TABLE 类实例缓存)、表定义缓存(TABLE_SHARE 类实例缓存)、读取 frm 文件。

然后介绍了把 select 子句中的星号(*)替换为表字段的过程。

最后介绍了 where 条件中的 Item_field 类实例找到其对应字段 Field 类实例的过程,并设置字段内容和 where 条件中的值进行比较时执行的函数。找到 Item_field 类对应字段 Field 类实例的过程中,使用了两级缓存,以及兜底逻辑:循环遍历表中字段。

3. 从 InnoDB 读数据 <- 点击阅读

第 3 篇,以 InnoDB 为例讲述从存储引擎中读取数据的过程,先介绍了创建 InnoDB 存储引擎实例,在这个过程中会建立 MySQL 和 InnoDB 索引的映射关系,以及会创建用于 InnoDB 执行查询过程的查询模板。

然后是填充查询模板的过程,主要介绍了文中示例 SQL 执行时涉及到的三个方面,分别是:根据查询优化阶段确定的要使用的索引,找到 InnoDB 中索引的实例;对回表的概念进行了说明;以及 InnoDB 会返回哪些字段内容给 server 层,又是怎么返回内容的?

最后是 InnoDB 执行查询的过程,先介绍了什么是预读缓存,以及什么情况下会使用预读缓存;简单介绍了 InnoDB 都是从 Buffer Pool 中读取数据;InnoDB 怎么通过一致性视图判断记录是否可见。

4. WHERE 条件 <- 点击阅读

第 4 篇,先介绍了 where 条件在源码中实现为类似树状的结构,并用一张图呈现了示例 SQL 中 where 条件的结构。

然后介绍了从存储引擎读取到的记录和 where 条件中的值进行比较的过程。

最后介绍了三种特殊类型的字段(set、enum、bit)作为 where 条件时,是怎么和记录中的字段内容进行比较的。

5. 发送数据给客户端 <- 点击阅读

第 5 篇,先介绍了 MySQL 会发送字段的哪些元数据信息给客户端,然后介绍各种类型字段,在发送给客户端之前,是怎么转换为字符串格式的,以及还会做哪些逻辑处理。

6. 网络缓冲区 <- 点击阅读

第 6 篇,从客户端和服务端数据交互的基本单元数据包(Packet)开始,介绍了 MySQL 中的连接缓冲区、结果集缓冲区,它们的自动增长逻辑和上下限;超过 16M 的大数据怎么发送和接收;net_buffer_length、max_allowed_packet 两个系统变量的配置,以及一个不起眼的小东西 Block Size。


这次的查询语句执行过程分析,以一条简单查询语句为基础,也是我写执行过程分析系统文章的基础篇,接下来计划要写的方向有这些:

  • 文件排序
  • group by 使用索引的执行过程
  • group by 使用临时表的执行过程
  • 内存临时表 & 磁盘临时表
  • 聚合函数的实现
  • 查询优化器
  • 子查询优化
    • 表上拉(Table Pullout)
    • 重复值消除(Duplicate Weedout)
    • 首次匹配(First Match)
    • 松散扫描(Loose Scan)
    • 子查询物化 Join
  • 连接(Join)查询
MySQL查询语句中关键字的执行顺序 了解MySQL查询语句关键字的执行顺序对于理清业务逻辑非常重要,因此本文将探讨MySQL查询语句中各关键字的执行顺序。 阅读详情

相关推荐

扫地机器人解决方案:工作原理与硬件构成

房间里柜子,鞋子,床,座椅,人都在什么地方?3、数字信号处理器。这主要是为控制芯片进行路径规划后,下发指令给执行的电机,包括舵轮(扫地机人前进,转向的轮子),扫地刷的电机,吸尘器的电机,让这些电机工作。扫地机器人的大脑主要用来规划路径,避障,以及人机交互,例如:人类设定打扫范围,以及语音指导扫地机器人进行打扫,都需要处理器进行处理后,将指令下发到执行机构。小脑属于跟执行层最近的控制区域,例如我们上面说的,后面两个处理器:数字信号处理器和微控制器都是对执行层(电机),进行控制和回馈外部信息的处理器。

迷途 7404

MySQL的执行原理

连接的本质就是把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户。所以我们把e1和e2两个表连接起来的过程如下图所示:这个过程看起来就是把e1表的记录和e2的记录连起来组成新的更大的记录,所以这个查询过程称之为连接查询。连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,像这样的结果集就可以称之为笛卡尔积。因为表e1中有3条记录,表e2中也有3条记录,所以这两个表连接之后的笛卡尔积就有3×3=9行记录。

weixin_55229531的博客 5万+

手把手教你用RMII接口配置以太网PHY芯片(附YT8512实战代码)

本文详细介绍了如何使用RMII接口配置以太网PHY芯片,以国产YT8512为例,提供从硬件设计到软件驱动的全流程实战指南。内容包括RMII接口技术解析、YT8512硬件设计要点、驱动开发实战代码及常见问题排查,帮助开发者快速实现以太网通信功能。

mac99的博客 996

MySQL执行流程详解

MySQL执行流程 优化器 查询引擎 存储引擎 bufferPool

qq_41992429的博客 1453

视觉辅助RIS波束追踪:用摄像头“看见”用户,实现毫秒级波束对准

在无线通信领域,波束成形技术是提升高频段信号覆盖与质量的核心手段,其原理是通过调整天线阵列的相位,使信号能量在特定方向相干叠加,形成高增益定向波束。这项技术的价值在于能有效克服高频信号路径损耗大、穿透性差的瓶颈,广泛应用于5G/6G、毫米波通信及室内定位等场景。然而,传统波束追踪依赖信道估计或波束扫描,存在训练开销大、实时性差的问题。本文聚焦于一种创新解决方案:将计算机视觉与可重构智能表面(RIS)相结合。通过摄像头直接感知用户位置,并利用RIS快速重构反射波束方向,实现了近乎零开销、毫秒级延迟的波束追踪,

weixin_33552698的博客 620

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

MYSQL执行过程和顺序详解

就MySQL在执行过程、sql执行顺序,以及一些相关关键字的注意点方面的学习分享内容。 在参考文章的基础上,会增加自己的理解、看法,希望本文章能够在您的学习中提供帮助。 如有错误的地方,欢迎指出纠错,互相学习,共同进步。

Bananaaay的博客 3929

【图像超分】论文复现:轻量化超分 | 残差特征蒸馏网络RFDN的Pytorch源码复现,跑通源码,整合到EDSR-PyTorch中进行训练,补充CCA的实现!

本文介绍了将RFDN(残差特征蒸馏网络)整合到EDSR-PyTorch框架中的实现过程。主要内容包括:1)环境配置与数据集准备;2)测试源码提供的x4预训练模型,并通过修改图像裁剪函数解决HR与SR尺寸不一致问题;3)训练过程详解,包括将RFDN源码模块整合到EDSR框架中,调整模型参数输入方式。文章还提供了完整的代码实现、训练好的模型权重下载链接,并对RFDN架构进行了详细拆解与注释。通过将RFDN与EDSR相结合,实现了轻量级图像超分辨率重建,获得了PSNR/SSIM等指标及可视化结果。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 433

MySQL实战45讲-第1-2讲-一条SQL查询语句是如何执行的?&& 一条SQL更新语句是如何执行的

redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候,表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1,这样可以保证MySQL异常重启之后数据不丢失。sync_binlog这个参数设置成1的时候,表示每次事务的binlog都持久化到磁盘。这个参数我也建议你设置成1,这样可以保证MySQL异常重启之后binlog不丢失。

weixin_44925329的博客 1234

华为od 面试八股文_前端_02_含答案

华为od 面试八股文_前端_02_含答案

MISAYAONE的博客 1998

华为OD机试双机位C卷-字符串解密(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【字符串解密】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 字符串解密。

qq_45776114的博客 734

Mysql——Sql查询语句的执行过程

从上层视角解释了SQL查询语句的执行过程,解释了会经过mysql的哪些组件,以及各个组件起到的作用和目的

zekser的博客 1245

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Mysql查询语句执行过程及运行原理

Mysql查询语句执行原理 数据库查询语句如何执行? DML语句首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树。 语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是否具有操作权限等 视图转换:将语法分析树转换成关系代数表达式,称为逻辑查询计划; 查询优化:在选择逻辑查询计划时,会有多个不同的表达式,选择最佳的逻辑查询计划; 代码生成:必须将逻辑查...

sinat_32176267的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL 学习(十)执行一条查询语句的内部执行过程、MySQL分层

MySQL 学习(十)执行一条查询语句的内部执行过程、MySQL分层

ACGkaka的博客 2022

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MySQL查询语句的执行流程

这篇文章主要从一条查询的sql语句入手,从发起查询,客户端与服务端建立起连接起手,深入到MySQL的存储引擎,为大家展现sql语句的一整套执行流程。

weixin_74120671的博客 1157

【MySQL】简单解析一条SQL查询语句的执行过程

在实际应用场景中,由于建立连接的过程相对复杂,会消耗一定资源,因此建议尽量减少连接的建立次数,优先采用长连接。但长连接可能引发内存问题,因为 MySQL 在执行过程中临时使用的内存由连接对象管理,若连接持续不关闭,这些内存资源无法释放,可能导致内存占用过高,甚至引发系统强制终止 MySQL 进程(OOM),表现为 MySQL 异常重启。以表 T 中 ID 字段无索引为例,执行器首先调用 InnoDB 引擎接口获取表的第一行数据,判断该行的 ID 值是否为 10,若不是则跳过该行,若是则将该行存入结果集。

山海守门人 2048

MySQL是如何执行一条SQL查询语句的

MySQL是如何执行一条SQL查询语句的

靖节先生的博客 2554

MySQL查询语句执行顺序详解

理解MySQL查询语句的执行顺序有助于编写更高效的查询。通过合理安排各个子句,我们可以更好地控制查询的行为和性能。希望这篇文章能帮助你更好地理解MySQL查询的执行过程,提高SQL查询优化的能力。

Java领域优秀创作者 1935

一条mysql的查询语句是怎样执行的?

MySQL 查询语句的执行过程是一个多阶段的复杂流程,涉及多个组件协同工作。

gdr12的专栏 1033

一条查询语句的执行过程

MySQL的框架分为Server层和存储引擎层Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。

m0_74346394的博客 1540

MySql一条查询语句的执行流程是怎么样的?

当我们在mysql执行一条查询语句,要经历哪些流程?

qq_45477639的博客 2816

MySQL 查询语句的执行顺序

MySQL查询语句的执行顺序与书写顺序完全不同,主要分为9个逻辑阶段:1.FROM/JOIN确定数据源;2.ON应用连接条件;3.WHERE行级过滤;4.GROUP BY分组聚合;5.HAVING组级过滤;6.SELECT选择列;7.DISTINCT去重;8.ORDER BY排序;9.LIMIT分页。关键区别在于WHERE在GROUP BY前执行,而HAVING在后,且SELECT阶段才能使用列别名。优化建议包括:尽早用WHERE过滤、避免SELECT*、谨慎使用排序和大分页。掌握执行顺序是SQL性能优化的

csdn_tom_168的博客 1306

MySQL如何执行查询语句

1. 前言 以下对MySQL执行查询语句的主要步骤进行分析,未涉及连接优化、排序优化等内容。 2. MySQL服务器架构 在了解MySQL如何执行查询语句前,首先需要了解MySQL服务器(MySQL Server)架构。 MySQL服务器架构示意图如下所示: 图片来源: https://www.oracle.com/technetwork/articles/javase/figure2-large-145676.jpg 。 图片来源: 《High Performance MySQL, 3rd Editio

adrninistrat0r的博客 953

【MySQL】一条SQL查询语句是如何执行的

聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。

qq_45721579的博客 1304

Mysql查询语句执行流程?更新语句执行流程?

连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划(选择使用哪个索引);

SevenCoding的博客 1479
上一篇: 聊聊 MySQL 网络缓冲区、net_buffer_length、max_allowed_packet 那些事
下一篇: Redo 日志无锁化设计并发写入 log buffer
cschmin
博客等级 码龄19年 9粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值