Explain 详解
explain 变种
- explain extended 可以查询出 filter 的值,rows*filter/100 估算 explain 前一个表连接的行数
- explain partitions 查询到 partitions 值,是否用到分区
- show warnings 查询 mysql 内部优化后可能的语句
explain 中的列
id
执行的优先级,id 越大优先级越高,如果 id 相等,用排序依次往下执行
select_type
- simple:简单查询,不包含子查询和 union
- primary:复杂查询外中最外的查询
- subquery:包含在 select 中的子查询,不在 from 子句中
- derved:包含在 from 子句中的子查询,MySQL 会把结果放入临时表中,也叫派生表
type
system>const>eq_ref>ref>range>index>all
NULL: 优化阶段分解查询语句,执行阶段不用再访问表或索引。比如索引列选取最小值,单独查询索引完成,不会访问表
system,const: mysql 将其优化并转换为一个常量,作用主键或者唯一键时,所有列与常数比较,最多访问一次。system 是 const
的特例,表里只有一条记录,匹配时为 system
eq_rf: 主键和唯一索引所有部分被使用,最多返回一条记录
ref: 使用了其他索引,或者唯一索引的部分前缀,
range: 范围扫描,使用了索引判断了范围
index: 扫码全索引能拿到结果,一般扫描到某个二级索引
ALL: 全表扫描
keny_len
通过计算长度可以知道联合索引用了哪些字段
ref 列
索引查询的条件的类型
rows
估计读取并检测的行数
extra
- Using index 使用覆盖索引(直接从二级索引拿取),不会回表
- Using where 用 where 处理,未使用到索引
- Using index condition 不完全被索引覆盖,是一个 where 前导列
- Using temporaray: 需要创建一张历史表来处理
- Using filesort: 文件排序,外部排序不是索引排序