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 层过滤后, 剩下多少满足查询的记录数量的百分比;