Loading

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 报表系统会非常有用。

posted @ 2026-03-10 09:42  LL。。。  阅读(3)  评论(0)    收藏  举报