面试知识库
极高 进阶

explain执行计划#

一句话答案#

explain 分析 SQL 性能,关键字段:type(访问类型,避免 ALL)、key(使用的索引)、rows(扫描行数)、Extra。

核心要点

type优劣: system > const > eq_ref > ref > range > index > ALL

重点字段:

字段关注
type避免ALL全表扫描
key是否使用索引
rows扫描行数越少越好
ExtraUsing index(覆盖索引好) / Using filesort(需优化)
面试回答(2分钟版)

EXPLAIN 是分析 SQL 执行计划的核心工具,我重点关注四个字段。type 列表示访问类型,从好到差依次是 const(主键等值)、eq_ref(关联查询走主键)、ref(普通索引等值)、range(范围扫描)、index(全索引扫描)、ALL(全表扫描),优化首先要消灭 ALL。key 列显示实际使用的索引,为 NULL 说明没走索引,可能是索引失效或优化器判断全表扫描更快。rows 列是优化器估算的扫描行数,越小越好,rows 很大说明需要优化索引或查询条件。Extra 列信息最丰富:Using index 表示覆盖索引不需回表是好状态,Using filesort 表示无法利用索引排序需要额外排序操作,Using temporary 表示用了临时表常见于 GROUP BY,两者都是性能瓶颈。优化口诀:消灭 ALL、减少 rows、争取 Using index、消除 filesort 和 temporary。

追问与易错

追问方向:

  • “type 为 ALL 一定需要优化吗?”→ 不一定,小表(几百行)全表扫描比走索引更快,优化器会自动选择;但大表 ALL 必须优化,加索引或改写查询条件
  • “Extra 中 Using filesort 怎么优化?”→ 建联合索引覆盖 WHERE + ORDER BY 字段,让排序直接利用索引有序性;如 WHERE a=1 ORDER BY b,建 (a, b) 联合索引即可消除 filesort
  • “key_len 怎么计算?”→ 各类型占字节数累加:int=4、bigint=8、varchar(n)=n*字符集字节数+2、允许 NULL 再+1;key_len 越长说明联合索引用到的列越多,可据此判断索引是否用满

易错点:

  • ❌ 有索引 type 就不是 ALL——优化器可能选择不走
  • ❌ 只看 type 不看 rows