MySQL 执行计划与 SQL 优化 · 知识图谱总览

基于 24 篇专栏文章(第 85 ~ 108 讲)整理 · SQL 性能优化的核心 = 看懂并改造执行计划

模块① 数据访问方式(SQL → type) 模块⑤ 执行计划字段(EXPLAIN 输出) 模块④ 规则优化(改写 SQL) 模块③ 成本优化(基于代价选计划) 模块② 多表关联执行原理 模块⑥ Extra 字段与 SQL 调优 课程脉络 · 24 讲(第 85 ~ 108 讲) 查询优化器的两大机制:改写 SQL(→④) · 估算成本(→③) EXPLAIN 读取 type 字段取值 单表访问组合成关联 读懂字段 → 发现问题 协同决定执行计划 SQL 语句 单表 / 关联 / 子查询 / 排序分组 MySQL 查询优化器 成本优化(估算各方案代价)+ 规则优化(等价改写 SQL) 为每条 SQL 生成一个成本最低的执行计划 SQL 执行计划 EXPLAIN 查看 · 12 个字段 const · ref · ref_or_null 主键/唯一索引等值 · 二级索引等值 · 等值+IS NULL range 范围查询 >= <= between · 基于索引做范围筛选 index 索引扫描 遍历二级索引叶子节点 · 覆盖索引时免回表 all 全表扫描 扫描聚簇索引全部叶子节点 · 性能最差 id · select_type · table 每个 SELECT 一个 id · 查询类型与目标表 type ★ 访问方式 决定每个表怎么查 → 对应模块① 各种取值 possible_keys · key · key_len · ref 候选索引 → 实际选用 → 等值匹配的对象 rows · filtered · Extra 预估扫描行数 · 过滤剩余比例 · 附加执行信息 SQL 等价改写 常量传播 · 删恒等条件 · 删无关括号 · 等值推导 子查询优化 标量子查询拆两步 · IN + 物化表 + 反向优化 semi join 半连接 IN 子查询在内核改写为半连接 · 语义等价 成本模型 IO 成本 1.0 / 数据页 · CPU 成本 0.2 / 行 全表扫描成本 页数×1.0 + 行数×0.2 + 微调值 索引访问成本 索引IO + 行数×0.2 + 回表IO · 逐索引估算 选择最优执行计划 对比全部方案 · 取成本最低者执行 驱动表 & 被驱动表 先查驱动表一波数据 → 逐条到被驱动表查 嵌套循环关联 Nested-Loop 外层结果集循环驱动内层查询 · 三表层层放大 内连接 / 外连接 INNER JOIN · LEFT/RIGHT OUTER JOIN · ON 条件 Extra 附加信息 Using index / where / filesort / temporary / join buffer 定位性能瓶颈 找全表扫描 · 扫描量过大 · 磁盘排序/临时表步骤 SQL 调优闭环 看懂计划 → 改写 SQL · 改良索引 → 复查计划 第 85 讲 执行计划与 SQL 优化总纲 第 86 ~ 90 讲 单表访问方式 const/ref/range/index/all 第 91 ~ 93 讲 多表关联执行原理 连接语法 · 嵌套循环 第 94 ~ 96 讲 成本优化 IO/CPU 成本估算 第 97 ~ 99 讲 规则优化 SQL 改写 · 子查询 · 半连接 第 100 ~ 108 讲 EXPLAIN 透彻研究 12 字段逐个击破 图例 MySQL 核心机制 SQL / 访问方式 执行过程 / 关联 成本模型 优化规则 性能陷阱 / 调优 知识流向

这份图谱讲什么

  • • SQL 优化 ≠ 只会建索引:索引优化只是入门技巧
  • • 复杂 SQL 调优的前提 = 看懂执行计划
  • • 优化器为每条 SQL 自动生成执行计划
  • • 执行计划 = 访问哪些表 · 用哪些索引 · 如何排序分组
  • • 看懂计划 → 改写 SQL / 改良索引 = SQL 调优闭环

六大专题模块(点击可跳转)

贯穿全篇的核心观念

  • • 先设计表结构满足业务 → 再根据查询设计索引
  • • 性能好坏的根源:数据页怎么读、索引树怎么走
  • • 二级索引叶子小,聚簇索引叶子是完整数据行
  • • 回表(回源)是理解一切执行计划的关键动作
  • • 实践崇尚简单 SQL:能单表不关联,能关联不子查询