Explain列详解
2021-07-08 17:13:28 0 举报
AI智能生成
Explain列详解
作者其他创作
大纲/内容
执行计划的列
id
id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
select_type
select_type表示对应行是简单还是复杂的查询
simple
简单查询。查询不包含子查询和union
primary
复杂查询中最外层的select
subquery
包含在select中的子查询(不在from子句中)
derived
包含在from子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)
union
table
这一列表示explain的一行正在访问哪个表。
type
这一列表示关联类型或访问类型,
即MySQL决定如何查找表中的行,
查找数据行记录的大概范围
即MySQL决定如何查找表中的行,
查找数据行记录的大概范围
- 依次从最优到最差分别为:
system>const>eq_ref>ref>range>index>ALL
一般来说,得保证查询达到range级别,最好达到ref
const,system:mysql能对查询的某部分进行优化并将其转化成一个常量(可以看showwarnings的结果)。
用于primarykey或uniquekey的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。
system是const的特例,表里只有一条元组匹配时为system
用于primarykey或uniquekey的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。
system是const的特例,表里只有一条元组匹配时为system
eq_ref:primarykey或uniquekey索引的列被连接使用,最多只会返回一条符合条件的记录。
这可能是在const之外最好的联接类型了,简单的select查询不会出现这种type。用于主键索引进行表连接场景
这可能是在const之外最好的联接类型了,简单的select查询不会出现这种type。用于主键索引进行表连接场景
ref:相比eq_ref,
不使用唯一索引,
而是使用普通索引或者唯一性索引的部分前缀,
索引要和某个值相比较,可能会找到多个符合条件的行。
不使用唯一索引,
而是使用普通索引或者唯一性索引的部分前缀,
索引要和某个值相比较,可能会找到多个符合条件的行。
1.简单select查询,name是普通索引(非唯一索引)
2.关联表查询,idx_film_actor_id是film_id和actor_id的联合索引,这里使用到了film_actor的左边前缀film_id部分。
range:范围扫描通常出现在in(),between,>,<,>=等操作中。使用一个索引来检索给定范围的行
index:扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。
表中有个主键索引以及一个普通索引,查询的时候,会用普通索引这个二级索引的叶子节点进行查询
ALL:即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。
表里面虽然有三个字段,但是只有一个主键,其他两个字段没有索引,也不会走index,直接扫描聚簇索引的叶子节点
possible_keys
key
key_len
ref
rows
Extra
1)Usingindex:使用覆盖索引
2)Using where:使用where语句来处理结果,并且查询的列未被索引覆盖
0 条评论
下一页