MySQL上执行一条SQL语句的全过程解密

发布于:2025-09-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

大家在学习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 → 关键字
    • idname → 标识符
    • > → 操作符
    • 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)提取 idname 字段

(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] → 读取磁盘/内存数据 + 加锁 + 写日志
   ↑
[执行器] ← 获取每一行数据
   ↓
[执行器] 组织结果集
   ↓
[返回客户端]