查询类型-type
const
- 常量级的查询
-
ref
查询使用普通索引,并不是唯一索引
查询使用类似“name is null”这样条件,即使name是主键索引或唯一索引,查询类似也是ref
eq_ref
例如:select * from t1 inner join t2 on t1.id=t2.id
- t1表进行all查询
-
ref_or_null
如果是类似“select * from table where name=x and name is not null”
查询使用普通索引,并且进行了“not null”这样的判断,那么查询类型是ref_or_null
range
利用索引进行范围筛选
例如“select * from table where age>x”,其中age是普通索引
index
只需要遍历二级索引页节点就可以拿到查询所需的数据,不需要回表,便是index
例如,一个联合索引“KEY(x1,x2,x3)”,查询语句:“select x1,x2,x3 from table where x2=123”
all
-
特殊情况
select * from table where x1=a and x2 =b
- 如果x1和x2分别都是一个索引,那么查询计划是:从两个非聚集索引树上过滤符合对应条件的数据,然后在内存中取一个交集,然后再去主键索引树上查询数据
Explain
字段含义
- id:每个执行计划都会有一个id,一条sql里可能会有多个查询语句多个查询计划
- select_type:查询类型
- simple
- primary
- subquery:子查询
- union:union后的查询
- union result:union查询中,俩表查询后,使用临时表进行合并
- MATERIALIZED: 子查询物化 ,当表出现在非相关子查询中并且需要进行物化时会出现MATERIALIZED关键词
- table:sql语句涉及的表
- partitions:表分区
- type:即查询类型
- possible_keys:可能会用到的索引
- key:实际使用的索引
- key_len:索引长度
- ref:
- const:表示和索引值进行等值匹配的是一个常量值
- 关联表字段名
- rows:预估读取数据条数
- filtered:经过搜索条件过滤后剩余数据的百分比
- extra
- using temporary:使用临时表
- using where:where 条件里使用了除索引外的其他字段
- using join buffer:提升关联查询性能
- using filesort:使用文件排序
- using index:采用覆盖索引
- Using join buffer (Block Nested Loop) BNL 优化,出现此项则代表多表 JOIN 连接没有走索引
