Skip to content

P21 SQL 的执行过程 ​

面试题:一条 SQL(比如 SELECT)在 MySQL 里从发出到返回,完整执行过程是什么?

完整链路(两大部分:Server 层 + 存储引擎层) ​

text
客户端 → 连接器 → 查询缓存(8.0 已移除) → 分析器 → 优化器 → 执行器 → 存储引擎

1. 连接器 ​

  • 建立连接、校验用户名密码、获取权限;
  • 管理连接数、空闲超时。

2. 查询缓存(MySQL 8.0 已删除) ​

  • 老版本:完全相同的 SQL 命中缓存直接返回;
  • 8.0 开始移除(缓存失效太频繁,弊大于利)。

3. 分析器(Parser) ​

  • 词法分析:把 SQL 拆成 token(关键字、表名、列名);
  • 语法分析:检查语法是否正确,生成语法树;
  • 语法错误在这里报出。

4. 优化器(Optimizer) ​

  • 决定怎么执行:选择索引、决定 join 顺序、是否用临时表/排序;
  • 生成执行计划;
  • EXPLAIN 看到的就是优化器选择的结果。

5. 执行器(Executor) ​

  • 调用存储引擎接口,逐行获取数据;
  • 做权限校验(也有在连接器做了的);
  • 处理结果集返回客户端;
  • 记录慢查询日志等。

6. 存储引擎(InnoDB) ​

  • 负责真正读写数据(Buffer Pool、索引、redo log 等);
  • 通过 API(如 innobase_get_rows)与执行器交互。

写操作的额外环节(以 UPDATE 为例) ​

text
执行器 → 引擎读取目标行 → 修改内存中的数据页 → 写 redo log(prepare) → binlog → redo log(commit) → 返回成功

通过 redo log(崩溃恢复)+ binlog(归档/主从) 两阶段提交保证一致性。

加分点 ​

  • 问"SELECT 和 UPDATE 过程差异":UPDATE 多出"加锁、修改、写日志、两阶段提交";
  • 优化器选错索引怎么办:FORCE INDEX、统计信息更新 ANALYZE TABLE;
  • 面试常追问:一条 SQL 慢,先看哪?→ 慢查询日志 → EXPLAIN 执行计划 → 索引/扫描行数 → 锁等待。

一句话总结 ​

SQL 执行 = 连接器(鉴权)→ 分析器(词法/语法)→ 优化器(选索引定计划)→ 执行器(调引擎拿数据)→ 存储引擎(实际读写),写操作再叠加 redo log/binlog 的两阶段提交保证崩溃恢复。

基于 VitePress 重建