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 的两阶段提交保证崩溃恢复。