SQL 执行全链路
SELECT * FROM user WHERE id = 1—— 这简单一行,在 MySQL 内部经历了什么?
一、MySQL 整体架构
- 1.1 Server 层——连接器、查询缓存、分析器、优化器、执行器
- 1.2 存储引擎层——InnoDB / MyISAM / Memory
- 1.3 架构图——各组件的位置
二、连接器
- 2.1 TCP 握手 + 身份认证
- 2.2 权限读取——连接建立时读取,之后不变
- 2.3 连接管理——
wait_timeout空闲连接超时 - 2.4 长连接 vs 短连接——长连接 OOM 问题
三、查询缓存(MySQL 8.0 已移除)
- 3.1 为什么移除——失效太频繁
- 3.2 表更新 → 缓存全部失效
- 3.3 替代方案——应用层缓存 Redis
四、分析器
- 4.1 词法分析——识别 SQL 关键字、表名、字段名
- 4.2 语法分析——检查 SQL 是否符合语法规则
- 4.3
You have an error in your SQL syntax的来源
五、优化器
- 5.1 选择索引——多个可用索引时选哪个
- 5.2 决定连接顺序——多表 JOIN 的驱动表选择
- 5.3 基于代价的优化(CBO)——
mysql.server_cost/mysql.engine_cost - 5.4 优化器的局限性——统计信息不准确
六、执行器
- 6.1 权限检查——对表的操作权限
- 6.2 调用存储引擎接口——
ha_rnd_next()逐行读取 - 6.3
rows_examined——扫描行数的统计
七、一条更新 SQL 的额外步骤
- 7.1 redo log——WAL 技术,先写日志再写磁盘
- 7.2 binlog——Server 层的归档日志
- 7.3 两阶段提交——redo log prepare → binlog write → redo log commit
八、总结
- 一条 SQL 的完整旅程图
- 各阶段的排查方法
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!