mysql 提供的 explain 执行计划能力是我们做 sql 调优的好帮手, 甚至可以说是我们观察 sql 执行效率的重要理论依据;
学好并用好 mysql explain 可以方便地写出高效率的 sql;

explain 详细说明

type

全称 join type, 表示查询访问类型, 共存在如下几种枚举类型 (性能由好到坏排序):

1
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all

以下各列按照好坏顺序从上到下排列:

名称 (由好到坏排序) 含义
system 系统表, 只有一行记录
const 索引一次即找到, 表示使用了主键索引
eq_ref 使用了唯一索引
ref 使用了普通索引
fulltext
ref_or_null 表示使用了普通索引, 同时使用了 is null
index_merge
unique_subquery
index_subquery
range 范围搜索 (一定用到了索引, 但存在范围匹配条件, 如 <, >, in, or, between..and..)
index 按索引顺序全表扫描
all 全表扫描

index 和 all 的区别:

  • all: 不使用索引的全表扫描;
  • index: 根据索引先查询到有序排列的所有 id, 然后依次回表获取数据;

当需要排序时, index 的效率优于 all;

possible_keys

当查询涉及的字段只要存在索引, 将会在 possible_keys 中被列出, 但不一定被实际使用到

key

表示查询中实际使用的索引, 如果为 NULL, 表示实际没有使用索引;

key_len

表示索引中用到的字节数;

ref

表示索引的具体哪一列被使用了;

rows

表示 mysql 预估认为它执行查询时必须扫描的行数;

filtered

表示存储引擎返回的数据在 server 层过滤后, 剩下多少满足查询的记录数量的百分比;

Extra

参考链接