第三篇:Explain 才是后端真正的 SQL 语言
摘要:后端优化SQL常陷入"玄学"困境,本质是不了解数据库执行计划。EXPLAIN命令让数据库展示其执行策略,关键看4个字段:key(使用索引)、rows(扫描行数)、type(访问方式)、Extra(额外操作)。通过分析执行计划,可针对性优化索引、查询结构等,将扫描行数降低。专业SQL优化流程是:explain分析→发现问题→针对性调整→验证效果。掌握EXPLAIN是从&qu
不会 explain 的后端,本质是在“猜数据库”
一、为什么很多后端优化 SQL,全靠“玄学”?
很多人优化 SQL 的方式是:
- 慢了 → 加索引
- 还慢 → 换写法
- 再慢 → 查博客
- 不行 → 再加索引
结果经常是:
- 索引越建越多
- 有的 SQL 快了,有的更慢了
- 自己也说不清为什么
本质问题只有一个:
👉 你不知道数据库“打算怎么查”。
而数据库真正决定性能的,不是 SQL 文本,而是:
👉 执行计划。
二、EXPLAIN 是什么?
一句后端版定义:
👉 EXPLAIN = 让 MySQL 把“执行计划”打印给你看。
你写:
SELECT * FROM t_order WHERE user_id = 123;
数据库脑子里已经决定了:
- 用不用索引
- 用哪个索引
- 扫多少行
- 要不要排序
- 要不要临时表
只是平时你看不到。
当你写:
EXPLAIN SELECT * FROM t_order WHERE user_id = 123;
👉 数据库会把它的“作战方案”给你。
所以可以非常直白地说:
👉 EXPLAIN 是后端和数据库对话的语言。
三、EXPLAIN 结果长什么样?
执行 explain 后,你会看到一张类似这样的表(示意):
+----+-------------+---------+------+--------------------------+---------------------+------+-------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | ref | rows | Extra |
+----+-------------+---------+------+--------------------------+---------------------+------+-------+--------+-----------------------------+
| 1 | SIMPLE | t_order | ref | idx_user,idx_user_status | idx_user_status_ct | const| 85000 | Using where; Using filesort |
+----+-------------+---------+------+--------------------------+---------------------+------+-------+--------+-----------------------------+
这张表不是“结果”,
而是:
👉 数据库准备怎么干活。
四、当前阶段,后端只需要盯死 4 个字段
你不用一上来把 explain 所有列都背下来。
真正干活,80% 的判断来自 4 列。
1️⃣ key —— 用了哪个索引(第一眼必看)
key = idx_user_status_ct
含义:
👉 数据库最终选用的索引。
危险信号:
key = NULL
👉 基本等价于:没走索引 / 全表扫描。
后端第一反应应该是:
👉 这条 SQL 有结构性问题。
2️⃣ rows —— 预计扫描多少行(工作量指标 ⭐)
rows = 85000
这是 explain 里最有价值的列之一。
它在告诉你:
👉 数据库觉得自己要“干多少活”。
一个非常实用的后端直觉:
- rows = 1 → 极好
- rows = 几十 → 很好
- rows = 几百/几千 → 可以
- rows = 几万 → 大概率慢
- rows = 几十万+ → 事故现场
👉 SQL 优化,本质就是:把 rows 打下来。
3️⃣ type —— 访问方式(效率等级)
你现在阶段,只要认识这三个就够:
const / eq_ref→ 主键 / 唯一索引(最好)ref / range→ 普通索引(常见)ALL→ 全表扫描(高危)
如果你看到:
type = ALL
👉 后端条件反射:
“这条 SQL 必须改。”
4️⃣ Extra —— 有没有额外折磨数据库
常见你一定要有感觉的几个:
Using where→ 有条件过滤(正常)Using filesort→ 排序没走索引Using temporary→ 用了临时表(危险信号)Using index→ 覆盖索引(加分项)
特别是:
👉 filesort + rows 很大
👉 temporary + rows 很大
基本就是慢 SQL 的标准形态。
五、一个典型慢 SQL 的 explain 画面
EXPLAIN
SELECT *
FROM t_order
WHERE user_id = 123
ORDER BY create_time DESC;
你可能看到:
- key:idx_user
- rows:200000
- Extra:Using filesort
后端该怎么解读?
👉 用 user_id 索引扫了 20 万行
👉 再额外排序
👉 性能瓶颈不在 SQL 语法,而在“扫描量 + 排序方式”
六、一个健康 SQL 的 explain 画面
EXPLAIN
SELECT id, status, create_time
FROM t_order
WHERE user_id = 123 AND status = 1
ORDER BY create_time DESC
LIMIT 20;
理想状态会接近:
- key:idx_user_status_ct
- rows:20~50
- Extra:Using where
后端看到这种 explain,应该有直觉:
👉 扫描量接近返回量
👉 排序走了索引
👉 这条 SQL 结构是健康的。
七、Explain 驱动 SQL 优化的标准流程
真正专业的 SQL 优化,从来不是“改一句试试”。
而是:
① explain
👉 看执行计划
② 找问题
- 用没用索引?
- 扫描行数大不大?
- 有没有 filesort / temporary?
③ 针对性调整
- 设计/调整索引
- 改 where / order by 结构
- 改分页方式
- 收敛字段(少 select *)
④ 再 explain 验证
👉 这是后端数据库优化的工程闭环。
八、为什么说 Explain 才是“真正的 SQL 语言”?
因为:
- SQL 是你写给数据库看的
- explain 是数据库写给你看的
SQL 告诉数据库:你想要什么。
Explain 告诉你:它打算怎么给。
👉 当你开始看 explain,你关注的就不再是“语句”,
👉 而是“执行方式”。
这正是后端能力和“会写 SQL”的本质区别。
九、这一篇你真正要记住的只有一句话
👉 SQL 优化不是调语法,而是用 explain 控制数据库的执行路径。
更多推荐

所有评论(0)