很好,这一篇是真正把“懂索引”变成“会优化 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 的核心是让查询走索引、减少扫描行数、避免回表和额外排序,同时结合最左匹配原则设计索引,从而提升查询效率。