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

1. MySQL 的逻辑架构图

在这里插入图片描述

  • MySQL 架构主要分为 Server 层和存储引擎层。
  • Server 层集成了连接器、查询缓存、分析器、优化器和执行器等核心组件,负责提供诸如日期、时间、数学和加密等内置函数,以及实现存储过程、触发器、视图等跨存储引擎的功能。
  • 存储引擎层则负责数据的实际存储与提取,采用插件式设计,支持 InnoDB、MyISAM、Memory 等多种引擎,其中 InnoDB 自 MySQL 5.5.5 版本起成为默认存储引擎。

2. SQL 查询语句执行详解

2.1. 连接器:建立连接的关键环节

客户端通过如下命令发起数据库连接请求。

mysql -h$ip -P$port -u$user -p

完成 TCP 握手后,连接器依据输入的用户名和密码进行身份验证。

若用户名或密码错误,系统会立即返回 “Access denied for user” 错误,连接随即终止。若认证成功,连接器会从权限表中检索该用户的权限信息,并在后续该连接的操作中以此为依据进行权限判定。即便管理员在用户建立连接后修改了其权限,已有的连接权限也不受影响,新权限仅对新建立的连接生效。

连接成功后,若客户端长时间无操作,此连接便进入空闲状态,可使用 show processlist 命令查看,其中 Command 列为 “Sleep” 的记录即表示空闲连接。

在这里插入图片描述

若空闲时长超过 wait_timeout(默认 8 小时),连接器会自动断开连接。此时若客户端再次发送请求,会收到 “Lost connection to MySQL server during query” 错误提示,需重新连接并执行操作。

在实际应用场景中,由于建立连接的过程相对复杂,会消耗一定资源,因此建议尽量减少连接的建立次数,优先采用长连接。但长连接可能引发内存问题,因为 MySQL 在执行过程中临时使用的内存由连接对象管理,若连接持续不关闭,这些内存资源无法释放,可能导致内存占用过高,甚至引发系统强制终止 MySQL 进程(OOM),表现为 MySQL 异常重启。

解决此问题有两种途径:一是定期主动断开长连接,比如在程序中判断执行过一个占用大量内存的查询操作后断开连接;二是在 MySQL 5.7 及以上版本,可利用 mysql_reset_connection 命令重新初始化连接资源,此操作无需重新连接和权限验证,就能使连接恢复到初始创建时的状态。

2.2. 查询缓存:双刃剑般的存在

查询缓存的设计初衷是存储已执行过的 SQL 查询语句及其结果,以键值对(key-value)形式存在,其中查询语句为键,查询结果为值。当 MySQL 接收到查询请求时,会首先在查询缓存中查找是否存在相同的查询语句。例如,对于查询语句 select * from T where ID=10,若之前执行过且结果已缓存,系统会直接返回缓存中的结果,显著提升查询效率。

然而,查询缓存存在明显的局限性。只要对某个表进行更新操作,该表相关的所有查询缓存都会被清空。在实际业务中,如电商订单管理系统,数据表频繁更新,查询缓存的命中率极低。因此,在大多数情况下,不建议启用查询缓存

可通过将 query_cache_type 设置为 DEMAND 来禁用默认的查询缓存,对于确实需要缓存的特定查询,可使用 SQL_CACHE 进行显式指定。例如 mysql> select SQL_CACHE * from T where ID=10

值得注意的是,自 MySQL 8.0 版本起,已彻底移除查询缓存功能。

2.3. 分析器:语法语义的把关者

若查询未命中缓存,便进入分析器阶段。

首先进行词法分析,分析器会将输入的 SQL 语句(由多个字符串和空格组成)分解识别。以 select * from T where ID=10 为例,分析器能够识别出 “select” 为查询关键字,“T” 是表名,“ID” 是列名。

完成词法分析后,紧接着进行语法分析,依据语法规则检查语句的合法性。比如,若语句 elect * from t where ID=1(少打了开头的字母 “s”),分析器会提示 “You have an error in your SQL syntax” 错误,并准确指出错误位置在 “use near” 后的内容。

对于表中不存在的列引发的错误,也是在分析器阶段被检测到。例如执行 select * from T where k=1,若表 T 中不存在字段 k,分析器在语法分析过程中检查列的有效性时,会报出 “Unknown column ‘k’ in ‘where clause’” 错误。

2.4. 优化器:效率提升的幕后推手

经过分析器确定查询意图后,优化器开始发挥作用。

当表存在多个索引或语句涉及多表关联(join)时,优化器的重要性尤为凸显。

例如,对于查询语句 mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20,优化器需要权衡是先从表 t1 中取出 c = 10 的记录的 ID 值,再关联到表 t2 判断 d 的值是否为 20;还是先从表 t2 中取出 d = 20 的记录的 ID 值,再关联到表 t1 判断 c 的值是否为 10。

这两种执行路径虽然逻辑结果一致,但执行效率可能存在较大差异,优化器的核心任务就是选择最优的执行方案,确定后将执行计划传递给执行器。

2.5. 执行器:数据查询的执行者

执行器首先检查用户是否具有对查询表的执行权限。例如,执行 mysql> select * from T where ID=10,若用户没有相应权限,会返回 “ERROR 1142 (42000): SELECT command denied to user ‘b’@‘localhost’ for table ‘T’” 错误。若用户有权限,则根据表的引擎定义调用相应引擎接口执行查询。

以表 T 中 ID 字段无索引为例,执行器首先调用 InnoDB 引擎接口获取表的第一行数据,判断该行的 ID 值是否为 10,若不是则跳过该行,若是则将该行存入结果集。

接着继续调用引擎接口获取 “下一行” 数据,并重复上述判断逻辑,直至遍历完表的所有行。最后,执行器将满足条件的行组成的记录集返回给客户端。

在数据库的慢查询日志中,rows_examined 字段记录了执行器调用引擎获取数据行的累加次数,反映了语句执行过程中的扫描行数。

但需注意,在某些情况下,执行器调用一次引擎接口,在引擎内部可能扫描了多行,所以引擎扫描行数与 rows_examined 并不一定完全相同。

3. 示例解析

3.1. 案例说明

假设有一个名为 employees 的表,包含 idnameagedepartment 等字段,其中 id 为主键且有索引,department 字段也有索引。执行查询语句 select * from employees where department = 'IT' and age > 30

3.2. 执行流程拆解

首先,连接器验证客户端连接请求,确认用户有权限访问数据库和 employees 表。

接着,查询缓存检查是否存在该查询的缓存结果,若不存在则进入分析器阶段。分析器识别出关键字、表名和列名,并检查语法和语义,确保语句合法且列存在。

然后,优化器根据索引情况和数据分布决定执行计划。由于 departmentage 都有索引,优化器会评估先根据 department 索引筛选出 IT 部门的记录,再对这些记录检查 age 是否大于 30 更高效,还是反之更优,最终确定最佳执行路径。

最后,执行器按照优化器确定的计划调用存储引擎接口。例如,如果选择先按 department 索引查找,执行器会通过引擎接口获取满足 department = 'IT' 的第一行数据,检查 age 是否大于 30,符合条件则存入结果集,然后继续获取下一行数据重复判断,直至遍历完所有符合 department = 'IT' 条件的记录。最终将结果集返回给客户端。

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

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

相关文章

如何将json字符串格式化

文章目录 如何对json字符串进行格式化显示hutool方案的示例和不足使用fastjson的方案 如何对json字符串进行格式化显示 将json字符串内容进行格式化的输出显示。本文介绍 hutool的方案和alibaba 的fastjson方案 hutool方案的示例和不足 引入依赖 <dependency><grou…

复杂 C++ 项目堆栈保留以及 eBPF 性能分析

在构建和维护复杂的 C 项目时&#xff0c;性能优化和内存管理是至关重要的。当我们面对性能瓶颈或内存泄露时&#xff0c;可以使用eBPF&#xff08;Extended Berkeley Packet Filter&#xff09;和 BCC&#xff08;BPF Compiler Collection&#xff09;工具来分析。如我们在Red…

unity学习18:unity里的 Debug.Log相关

目录 1 unity里的 Debug.log相关 2 用Debug.DrawLine 和 Debug.DrawRay画线 2.1 画线 1 unity里的 Debug.log相关 除了常用的 Debug.Log&#xff0c;还有另外2个 Debug.Log("Debug.Log"); Debug.LogWarning("Debug.LogWarning"); Debug.LogErro…

IoTDB 常见问题 QA 第三期

关于 IoTDB 的 Q & A IoTDB Q&A 第三期持续更新&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;查询最新值 & null 数据相加方…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

Swift 趣味开发:查找拼音首字母全部相同的 4 字成语(上)

概述 Swift 语言是一门现代化、安全、强大且还算性感的语言。在去年 WWDC 24 中苹果正式推出了秃头码农们期待许久的 Swift 6.0&#xff0c;它进一步完善了 Swift 语言的语法和语义&#xff0c;并再接再厉——强化了现代化并发模型的安全性和灵活性。 这里我们不妨用 Swift 来…

C++ STL之容器介绍(vector、list、set、map)

1 STL基本概念 C有两大思想&#xff0c;面向对象和泛型编程。泛型编程指编写代码时不必指定具体的数据类型&#xff0c;而是使用模板来代替实际类型&#xff0c;这样编写的函数或类可以在之后应用于各种数据类型。而STL就是C泛型编程的一个杰出例子。STL&#xff08;Standard …

VUE3 + Ant Design Vue4 开发笔记

异常记录 [Vue warn]: Extraneous non-props attributes (options) were passed to component but could not be automatically inherited because component renders fragment or text root nodes 定位原因解决方法 错误的中文释义&#xff1a;[Vue 警告]&#xff1a;传递给…

QT跨平台应用程序开发框架(2)—— 初识QT

目录 一&#xff0c;创建helloworld 1.1 通过图形化 1.2 通过代码 1.3 通过编辑框 1.4 使用按钮 二&#xff0c;对象树 2.1 关于对象树 2.2 演示释放流程 三&#xff0c;乱码问题 3.1 为什么会有乱码问题 3.2 解决乱码问题 四&#xff0c;认识Qt坐标系 五&#xf…

【搭建JavaEE】(3)前后端交互,请求响应机制,JDBC数据库连接

前后端交互 Apache Tomat B/S目前主流。 tomat包含2部分&#xff1a; apache容器 再认识servlet 抽象出的开发模式 项目创建配置 maven javaeetomcat 忽略一些不用的文件 webapp文件夹 HiServlet 这里面出现了webinfo&#xff0c;这个别删因为这个呢&#xff0c;是这这个这…

美摄科技PC端视频编辑解决方案,为企业打造专属的高效创作平台

在当今这个信息爆炸的时代&#xff0c;视频已成为不可或缺的重要内容形式&#xff0c;美摄科技推出了PC端视频编辑解决方案的私有化部署服务&#xff0c;旨在为企业提供一款量身定制的高效创作平台。 一、全面功能&#xff0c;满足企业多样化需求 美摄科技的PC端视频编辑解决…

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里&#xff0c;视觉内容无处不在&#xff0c;而创建和编辑这些内容的能力已经成为许多行业的核心技能…

STM32-笔记41-RTC(实时时钟)

一、什么是RTC&#xff1f; 实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路&#xff0c;通常称为时钟芯片。 实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设…

51c自动驾驶~合集46

我自己的原文哦~ https://blog.51cto.com/whaosoft/13050104 #世界模型会是L3自动驾驶的唯一解吗 三维空间占有率&#xff08;3D Occupancy&#xff09;预测的目的是预测三维空间中的每个体素是否被占有&#xff0c;如果被占有&#xff0c;则对应的体素将被标记。3D Semant…

mybatis-spring @MapperScan走读分析

接上一篇文章&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145100531&#xff0c; 本文注解分析mybatis-spring中的MapperScan注解&#xff0c;则将容易许多。 目录 MapperScan注解定义ConfigurationClassPostProcessor扫描注册beanDefinitionorg.mybatis.s…

Apache PAIMON 学习

参考&#xff1a;Apache PAIMON&#xff1a;实时数据湖技术框架及其实践 数据湖不仅仅是一个存储不同类数据的技术手段&#xff0c;更是提高数据分析效率、支持数据驱动决策、加速AI发展的基础设施。 新一代实时数据湖技术&#xff0c;Apache PAIMON兼容Apache Flink、Spark等…

SQL面试题1:连续登陆问题

引言 场景介绍&#xff1a; 许多互联网平台为了提高用户的参与度和忠诚度&#xff0c;会推出各种连续登录奖励机制。例如&#xff0c;游戏平台会给连续登录的玩家发放游戏道具、金币等奖励&#xff1b;学习类 APP 会为连续登录学习的用户提供积分&#xff0c;积分可兑换课程或…

电商系统,核心通用架构案例设计方案浅析

文章目录 一、用户系统案例设计1、用户信息的存储方案2、用户注册确保唯一3、用户数据合并方案4、用户敏感信息加密存储5、数据传输安全性6、多用户数据隔离性7、防止恶意注册8、用户好友关系存储方案9、用户登录token方案10、会员优先处理设计 二、网关系统设计1、网关的功能2…

【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)

2025 4th International Conference on Materials Engineering and Applied Mechanics 重要信息 大会官网&#xff1a;www.icmeaae.com 大会时间&#xff1a;2025年3月7-9日 大会地点&#xff1a;中国西安 截稿时间&#xff1a;2025年1月24日23:59 接受/拒稿通知&#xf…

SQL面试题2:留存率问题

引言 场景介绍&#xff1a; 在互联网产品运营中&#xff0c;用户注册量和留存率是衡量产品吸引力和用户粘性的关键指标&#xff0c;直接影响产品的可持续发展和商业价值。通过分析这些数据&#xff0c;企业可以了解用户行为&#xff0c;优化产品策略&#xff0c;提升用户体验…