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 的完整旅程图
  • 各阶段的排查方法