大家在学习mysql时大多都会是体系化的学习,深入了解mysql中的各种组件各种索引、锁机制,但是从整体视角如果在Mysql执行一条sql语句究竟发生了什么?会经过哪些组件?本文会从整体视角详细讲下
一、整体阶段:
先说结论,从sql语句到达mysql客户端到返回结果共经过以下流程:
客户端 → 连接器 → 查询缓存(已废弃)→ 分析器 → 优化器 → 执行器 → 存储引擎 → 返回结果
二、详细介绍:
1.客户端:
用户通过客户端工具(如 mysql 命令行、Navicat、JDBC 等)发送一条 SQL 语句,例如:
SELECT id, name FROM users WHERE age > 25;
2.连接器:
- 负责处理客户端连接、权限验证、维持会话。
- 验证用户名密码,检查用户是否有权限访问目标数据库/表。
- 创建一个“线程”来处理该连接,并维护连接状态(如事务、临时表等)。
- 如果使用长连接,这个线程会保持活跃;短连接则用完断开。
3.查询缓存 —— ⚠️ 已废弃(MySQL 8.0+)
- 在旧版 MySQL(<8.0)中,SQL 语句会被哈希后查找是否已有结果缓存。
- 如果命中,直接返回结果,跳过后续步骤。
- 但由于更新频繁导致缓存失效严重,性能差,MySQL 8.0 起已完全删除此模块
4.分析器 —— 语法与语义分析
分析器一句话描述就是执行sql先分析一波,分析你要做啥,如果你的sql有问题会直接报错,就像工作中老板向我们派发工作,你得先分析下能不能做,不能做及时反馈给老板,让老板调整工作内容,具体实现以刚刚sql为例:
(1) 词法分析
- 将 SQL 字符串拆分为“词元”(Token),比如:
SELECT
→ 关键字id
,name
→ 标识符>
→ 操作符25
→ 数值常量
(2) 语法分析
- 根据 MySQL 的语法规则,构建出 抽象语法树
- 检查语法是否正确,例如:
- 是否缺少关键字?
- 括号是否匹配?
- 表达式结构是否合法?
❌ 若语法错误 → 报错:You have an error in your SQL syntax...
(3) 语义分析
- 验证对象是否存在:
- 数据库
xxx
是否存在? - 表
users
是否存在? - 列
age
是否存在?
- 数据库
- 权限检查:当前用户是否有读取该表的权限?
- 解析出涉及的表、字段、条件、排序等信息。
5.优化器 —— 生成执行计划、
这是 SQL 执行过程中最复杂也最智能的部分。优化器的目标是找到一个最优的执行计划 (Execution Plan),以尽可能低的成本(主要是 I/O 和 CPU 时间)完成查询。具体如下
(1)选择访问方式
- 全表扫描 vs 索引扫描
- 使用哪个索引?(如果有多个索引)
- 是否走覆盖索引(Covering Index)?
(2)选择连接顺序
- 多表 JOIN 时,先查哪张表效率更高?
- 例如:
A JOIN B
还是B JOIN A
更快?
🎯 输出结果:执行计划
6.执行器 —— 调用存储引擎接口执行
执行器根据优化器生成的执行计划,调用存储引擎的 API 来实际读写数据。
主要职责:
- 调用存储引擎(如 InnoDB)的接口进行数据读取或修改。
- 处理记录的过滤、排序、分组、聚合等操作。
- 对于 DML 操作,还需处理事务、锁、日志等。
上述sql为例:
(1)打开表 users
(调用 handler::open()
)
(2)根据索引或主键查找满足 age > 25
的记录
(3)逐行读取数据(调用 index_read()
或 rnd_next()
)
(4)检查是否符合 WHERE 条件(回表、二次过滤)
(5)提取 id
, name
字段
(6)将符合条件的结果返回给执行器
(7)执行器组织成结果集,发送给客户端
7.存储引擎层(如 InnoDB)
真正负责数据的物理存储和检索。
InnoDB 的典型行为包括:
- 使用 B+ 树管理索引和数据页
- 通过缓冲池 缓存热点数据
- 实现 MVCC(多版本并发控制)支持快照读
- 加行锁、间隙锁(防止幻读)
- 写 Redo Log(持久性)、Undo Log(事务回滚)
👉 执行器每请求一行,InnoDB 就返回一行(“流式”读取)
8.返回结果给客户端
通过网络协议传回客户端
三、不同类型 SQL 的差异
SQL 类型 | 特殊处理 |
---|---|
INSERT |
执行器调用存储引擎插入接口,记录写入 undo/redolog,可能触发唯一键检查 |
UPDATE |
先查再改,涉及旧值保存(undo)、加锁、binlog 记录 |
DELETE |
标记删除(purge 延迟清理),写日志 |
BEGIN/COMMIT |
控制事务生命周期,涉及两阶段提交(XA) |
四、总结:
[客户端]
↓ 发送 SQL
[连接器] → 验证身份 & 创建连接线程
↓
[分析器] → 词法/语法/语义分析 → 构建 AST
↓
[优化器] → 生成最优执行计划(EXPLAIN 可见)
↓
[执行器] → 调用存储引擎 API 执行
↓
[存储引擎 InnoDB] → 读取磁盘/内存数据 + 加锁 + 写日志
↑
[执行器] ← 获取每一行数据
↓
[执行器] 组织结果集
↓
[返回客户端]