MySQL 执行计划(EXPLAIN 深度解析 + SQL优化)

5 阅读3分钟

很好,这一篇是真正把“懂索引”变成“会优化 SQL”的关键一步
你如果能把 EXPLAIN 看懂,基本就具备了排查慢 SQL 的能力


MySQL 执行计划(EXPLAIN 深度解析 + SQL优化)


一、先说结论(面试高分版)

EXPLAIN 用于分析 SQL 的执行计划,帮助判断是否使用索引、扫描方式及性能瓶颈。通过重点关注 type、key、rows、extra 等字段,可以定位慢 SQL 并进行针对性优化。


二、什么是 EXPLAIN?


👉 用法:

EXPLAIN SELECT * FROM user WHERE name = '张三';

👉 输出:

id | select_type | table | type | key | rows | extra

👉 本质:

查看 MySQL 打算怎么执行这条 SQL

三、核心字段详解(面试重点🔥)


1️⃣ type(最重要)

👉 表示查询方式(性能核心)


🔥 性能从好到差:

system > const > eq_ref > ref > range > index > ALL

常见类型:


✅ const(最好)
SELECT * FROM user WHERE id = 1;

👉 主键查询



✅ ref(常用)
WHERE name = '张三'

👉 使用普通索引



⚠️ range
WHERE age > 20

👉 范围查询



❌ ALL(最差)
全表扫描

👉 必须优化!



2️⃣ key(是否用索引)


👉 显示使用的索引:

key = idx_name

👉 如果是:

NULL

❌ 没用索引!



3️⃣ rows(扫描行数)


👉 预估扫描数据量:

越小越好


4️⃣ extra(关键优化点)


🔥 常见值:


❌ Using filesort

👉 额外排序(性能差)


❌ Using temporary

👉 使用临时表(性能差)


✅ Using index

👉 覆盖索引(性能好)


⚠️ Using where

👉 需要过滤



四、一个完整分析案例(实战)


❗SQL:

SELECT * FROM user WHERE name = '张三';

EXPLAIN:

type: ALL
key: NULL
rows: 1000000

👉 问题:

  • 全表扫描
  • 没索引

✅ 优化:

CREATE INDEX idx_name ON user(name);

👉 再看:

type: ref
key: idx_name
rows: 10

🔥 性能直接提升!


五、SQL 优化核心思路(非常重要)


🎯 1:让 SQL 走索引


❗错误:

WHERE name LIKE '%三'

👉 ❌ 不走索引


✅ 正确:

WHERE name LIKE '张%'


🎯 2:避免回表(覆盖索引)


❗原SQL:

SELECT * FROM user WHERE name = '张三';

✅ 优化:

SELECT name FROM user WHERE name = '张三';

👉 命中:

Using index


🎯 3:合理建联合索引


❗错误:

WHERE age = 20 AND name = '张三'

索引:

(age, name)

👉 ❌ 不一定最佳


✅ 正确:

(name, age)

👉 命中最左匹配



🎯 4:减少扫描行数


👉 目标:

rows 越小越好

方法:

  • 加索引
  • 精确条件


🎯 5:避免排序和临时表


❗问题:

ORDER BY name;

👉 出现:

Using filesort

✅ 优化:

建立索引


六、常见慢 SQL 场景(真实项目)


❗1:分页深翻页

SELECT * FROM user LIMIT 100000, 10;

👉 ❌ 非常慢


✅ 优化:

WHERE id > 100000 LIMIT 10;


❗2:函数操作

WHERE DATE(create_time) = '2024-01-01'

👉 ❌ 索引失效


✅ 优化:

WHERE create_time >= '2024-01-01'
  AND create_time < '2024-01-02'


❗3:隐式类型转换

WHERE id = '1'

👉 ❌ 可能不走索引



七、一个高级理解(拉开差距)


👉 EXPLAIN 本质是:

MySQL 优化器的决策结果

👉 优化器会考虑:

  • 索引选择
  • 扫描成本
  • IO 成本

👉 所以:

索引建了 ≠ 一定用

🔥 这是很多人不知道的点!


八、调优流程(实战模板)


你可以这样做:

1. EXPLAIN SQL
2. 看 type(有没有 ALL)
3. 看 key(有没有索引)
4. 看 rows(大不大)
5. 看 extra(有没有 filesort / temporary)
6. 调整索引 or SQL

九、总结(面试高分表达)

你可以这样说:

EXPLAIN 用于分析 SQL 执行计划,通过 type、key、rows 和 extra 等字段判断查询性能。优化 SQL 的核心是让查询走索引、减少扫描行数、避免回表和额外排序,同时结合最左匹配原则设计索引,从而提升查询效率。