SQL语句是如何在MySQL中执行的

一、先明确 MySQL 核心架构:Server 层 + 存储引擎层

MySQL 的架构分为两大核心层,所有 SQL 语句的执行都会先经过 Server 层的统一处理,再由存储引擎层完成数据的实际存取:

  • Server 层:是 MySQL 的核心,包含连接器、查询缓存(8.0 移除)、分析器、优化器、执行器等核心组件,还涵盖所有内置函数(如字符串、日期计算)、存储过程、触发器、视图等,跨存储引擎的功能都在这一层实现;
  • 存储引擎层:负责数据的存储和提取(如 InnoDB、MyISAM、Memory 等),以插件形式存在,Server 层通过统一接口与存储引擎交互,最常用的是 InnoDB(MySQL 5.5.5 后默认)。

二、Server 层核心组件(执行链路的核心节点)

1、连接器:建立连接,验证身份(所有 SQL 执行的第一步)

当客户端发起 MySQL 连接请求时,首先与连接器交互:

  • 核心动作 :
    1. 验证用户名 / 密码(错误则返回Access denied,连接终止);
    2. 验证通过后,查询该用户的权限(权限信息会缓存,后续整个连接周期内权限以本次查询为准,即使中途修改用户权限,当前连接也不受影响);
    3. 建立 TCP 连接,进入 "空闲状态"(可通过show processlist看到Sleep状态的连接),客户端闲置超wait_timeout(默认 8 小时)则自动断开。
  • 关键作用:是客户端与 MySQL 交互的 "入口",负责连接管理、身份认证、权限缓存。

2、查询缓存:缓存查询结果(MySQL 8.0 已移除,仅作历史说明)

连接器建立连接后,若为查询语句(如SELECT),MySQL 8.0 之前会先查查询缓存:

  • 核心逻辑:以 "查询语句字符串" 为 Key,查询结果为 Value,缓存到内存中;若缓存命中,直接返回结果,跳过后续分析 / 优化 / 执行步骤;若未命中,继续后续流程。
  • 被移除的原因:缓存失效成本极高(只要表数据有更新,该表所有查询缓存都会清空),实际生产中(如频繁更新的业务表)缓存命中率极低,反而增加性能开销。

3、分析器:解析 SQL,判断 "语法是否合法 + 要做什么"

若跳过 / 未命中查询缓存,SQL 进入分析器,核心做 "词法分析" 和 "语法分析":

  • 词法分析 :拆解 SQL 语句,识别关键词和元素。例如SELECT id FROM user WHERE age = 18;,会识别出:这是SELECT查询语句,查询列是id,查询表是user,条件是age=18;
  • 语法分析 :校验 SQL 语法是否符合 MySQL 规范(如关键词拼写错误、缺少分号、表名 / 列名不存在等),若语法错误,返回You have an error in your SQL syntax;
  • 关键输出:生成 "语法树"(描述 SQL 要执行的逻辑),传递给优化器。

4、优化器:选择最优执行方案

分析器确定 "要做什么" 后,优化器决定 "怎么做"------ 在多个可行的执行计划中选择成本最低的:

  • 优化场景举例 :
    1. 多表关联查询(如JOIN):决定表的连接顺序(先查小表还是大表);
    2. 索引选择:若 WHERE 条件有多个索引可选,选择最优索引(如区分度高的索引);
    3. 执行计划优化:如是否使用覆盖索引、是否走全表扫描等。
  • 关键输出 :生成 "执行计划"(可通过EXPLAIN查看),传递给执行器。

5、执行器:执行 SQL,与存储引擎交互

优化器生成执行计划后,执行器开始实际执行,核心步骤:

  1. 权限校验:再次校验当前用户对目标表 / 列的操作权限(避免连接器缓存权限后权限变更),无权限则返回错误;
  2. 调用存储引擎接口:根据执行计划,向存储引擎发起数据存取请求(如读取行、更新行);
  3. 处理结果 :
    • 若为查询语句:遍历存储引擎返回的结果集,返回给客户端;
    • 若为更新语句:执行数据修改,并触发事务日志(redo log/undo log)写入。

三、不同 SQL 语句的执行过程拆解

1、查询语句

完整链路:

复制代码
客户端发起请求 → 连接器(建立连接+认证+权限缓存)→ 查询缓存(8.0跳过)→ 分析器(词法/语法分析→生成语法树)→ 优化器(选择索引/执行计划)→ 执行器(权限校验→调用InnoDB接口读取数据)→ 存储引擎(读取数据:走age索引→返回id)→ 执行器(整理结果)→ 返回客户端
  • 执行器执行时,会逐行调用存储引擎的next_row接口读取数据,直到满足条件的所有行都被读取完毕。

2、更新语句

更新语句比查询多了 "事务日志" 和 "持久化" 环节(基于 InnoDB),完整链路:

复制代码
客户端发起请求 → 连接器(建立连接+认证+权限缓存)→ 分析器(解析UPDATE语句,确认目标表/列/条件)→ 优化器(选择id索引作为执行计划)→ 执行器(权限校验→调用InnoDB接口)→ 存储引擎(执行更新):
   1. 加行锁(id=1的行,避免并发更新冲突);
   2. 读取原数据(生成undo log,用于事务回滚);
   3. 修改数据(内存中更新name字段);
   4. 写入redo log(标记为"准备状态",保证崩溃恢复);
→ 执行器(触发binlog写入,记录更新逻辑)→ 存储引擎(将redo log标记为"提交状态",事务提交)→ 返回客户端"更新成功"
  • WAL 机制:InnoDB 为了性能,更新时先写内存和 redo log(磁盘顺序写),而非直接刷磁盘,后续由后台线程异步将内存数据刷到磁盘(落盘),保证性能和数据可靠性。

四、总结

  1. 核心逻辑:所有 SQL 语句的执行都遵循 "连接→解析→优化→执行" 的核心流程,Server 层负责逻辑处理,存储引擎层负责数据存取,分层架构保证了功能解耦和扩展性;
  2. 查询 vs 更新:查询语句核心是 "读取数据",流程更简洁;更新语句需额外处理锁、事务日志(redo/undo log)、binlog,保证数据一致性和可恢复性;
  3. 关键组件 :
    • 连接器:连接管理的基础;
    • 分析器:保证 SQL "合法";
    • 优化器:保证 SQL "高效";
    • 执行器:保证 SQL "正确执行" 并与存储引擎交互;
    • 存储引擎:保证数据 "安全存取"(事务、锁、索引等)。
相关推荐
乌暮1 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方2 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
flash俊杰3 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
2501_933923254 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵5 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛6 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5206 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
古典和浪漫7 小时前
MVCC机制
数据库
xixingzhe27 小时前
mysql全量、增量备份
数据库·mysql
AllData公司负责人15 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql