Explain 详解

explain 变种

  • explain extended 可以查询出 filter 的值,rows*filter/100 估算 explain 前一个表连接的行数
  • explain partitions 查询到 partitions 值,是否用到分区
  • show warnings 查询 mysql 内部优化后可能的语句

image-20230215102200140

explain 中的列

image-20230215102949179

id

执行的优先级,id 越大优先级越高,如果 id 相等,用排序依次往下执行

select_type

  1. simple:简单查询,不包含子查询和 union
  2. primary:复杂查询外中最外的查询
  3. subquery:包含在 select 中的子查询,不在 from 子句中
  4. 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

通过计算长度可以知道联合索引用了哪些字段

image-20230215162030444

ref 列

索引查询的条件的类型

rows

估计读取并检测的行数

extra

  • Using index 使用覆盖索引(直接从二级索引拿取),不会回表
  • Using where 用 where 处理,未使用到索引
  • Using index condition 不完全被索引覆盖,是一个 where 前导列
  • Using temporaray: 需要创建一张历史表来处理
  • Using filesort: 文件排序,外部排序不是索引排序