MySQL EXPLAIN
一、10秒看 EXPLAIN 的顺序
拿到 EXPLAIN 结果后,只看 4列:
type
key
rows
extra
检查顺序:
1 看 type
2 看 key
3 看 rows
4 看 extra
二、第1步:看 type(最重要)
执行:
EXPLAIN SELECT * FROM iot_data WHERE order_no='A001';
假设返回:
| type | key | rows |
|---|---|---|
| ALL | NULL | 500000 |
如果看到:
type = ALL
说明:
全表扫描
在 IOT / 日志 / 报表表里这是非常危险的。
性能等级:
| type | 性能 |
|---|---|
| system | 最好 |
| const | 很好 |
| eq_ref | 很好 |
| ref | 正常 |
| range | 还行 |
| index | 一般 |
| ALL | 最差 ❌ |
优化目标:
至少 ref
最好 range
三、第2步:看 key(有没有使用索引)
例如:
| possible_keys | key |
|---|---|
| idx_order | idx_order |
说明:
SQL 使用了 idx_order 索引
如果:
key = NULL
说明:
索引没有用上
原因可能是:
- 没有索引
- 类型不一致
- 函数导致索引失效
四、第3步:看 rows(扫描多少数据)
例如:
| rows |
|---|
| 100000 |
意思:
MySQL 预计扫描10万行
优化目标:
| 数据表规模 | 建议 rows |
|---|---|
| 100万 | <1000 |
| 1000万 | <5000 |
如果:
rows = 500000
说明 SQL 会慢。
五、第4步:看 Extra
常见情况:
1 Using index 👍
Using index
说明:
覆盖索引
非常快。
2 Using where
Using where
正常。
3 Using filesort ⚠️
Using filesort
说明:
ORDER BY 没有用索引
需要额外排序
数据多时会慢。
4 Using temporary ⚠️
Using temporary
说明:
使用临时表
一般出现在:
GROUP BY
六、真实例子(报表SQL)
SQL:
SELECT
order_no,
AVG(xbar)
FROM iot_minute_stat
WHERE stat_time BETWEEN '2026-03-10 08:00' AND '2026-03-10 10:00'
GROUP BY order_no
EXPLAIN:
| type | key | rows | extra |
|---|---|---|---|
| ALL | NULL | 1200000 | Using where; Using temporary |
问题:
全表扫描
120万行
临时表
七、优化方法
建立索引:
CREATE INDEX idx_time_order
ON iot_minute_stat(stat_time,order_no);
再执行:
EXPLAIN SELECT ...
结果:
| type | key | rows |
|---|---|---|
| range | idx_time_order | 3500 |
性能提升:
120万 → 3500
八、最常见的索引失效原因
很多人遇到:
有索引
但是没用
最常见原因:
1 使用函数
错误:
SELECT *
FROM iot_data
WHERE DATE(collect_time)='2026-03-10'
索引失效。
正确写法:
SELECT *
FROM iot_data
WHERE collect_time BETWEEN
'2026-03-10 00:00:00'
AND
'2026-03-10 23:59:59'
2 类型不一致
表:
order_no VARCHAR
SQL:
WHERE order_no = 1001
应该:
WHERE order_no = '1001'
3 LIKE 前缀 %
错误:
WHERE name LIKE '%abc'
索引失效。
正确:
WHERE name LIKE 'abc%'
九、报表SQL优化经验
MES / ERP 报表建议:
必建索引
时间
订单
设备
指标
例如:
CREATE INDEX idx_order_tag_time
ON iot_minute_stat(order_no,tag,stat_time);
十、开发人员必备口诀
看 EXPLAIN 时:
type 看扫描方式
key 看索引
rows 看扫描量
extra 看排序临时表
只要看到:
ALL
NULL
rows 很大
Using filesort
就说明 SQL 需要优化。
如果你愿意,我可以再教你 一个非常实用的东西(很多程序员不知道):
如何通过 3 条规则设计索引,让 90% SQL 自动变快
还有:
- 联合索引正确顺序
- 为什么有索引但不用
- 千万级表如何设计索引
这对 你现在做 JSP + MySQL 报表系统会非常有用。

浙公网安备 33010602011771号