用 EXPLAIN 看执行计划
EXPLAIN 看四个关键点:key 有没有命中索引、type 访问类型好不好、rows 扫描行数大不大、Extra 有没有回表/排序/临时表。
bash
EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 1;
-
通过 key 和 key_len 检查是否命中了索引:
-
key为NULL→ 没走索引,可能存在索引失效 -
key_len→ 判断联合索引实际用到了哪几列
-
-
通过 type 判断访问类型,看是否有优化空间:
-
好坏顺序:
system > const > eq_ref > ref > range > index > ALL -
出现
ALL(全表扫描)或index(全索引扫描)说明需要优化
-
-
通过 rows 和 filtered 判断扫描代价:
-
rows越大越慢,接近全表行数最危险 -
filtered越低,说明扫了很多无效行
-
-
通过 Extra 判断是否回表:
-
有
Using index→ 覆盖索引,不回表 -
无
Using index但key有值 → 可能回表 -
出现
Using filesort/Using temporary→ 排序或分组没走索引 -
回表严重时,可尝试添加覆盖索引 或减少 SELECT 字段
-