mysql explain详解

mysql中,使用explain可以模拟优化器执行sql语句,分析查询语句的性能瓶颈。

 

 

id:select查询的序号,表示的是查询中执行select子句的顺序。关注该字段获取sql语句各子句的执行顺序

1. id相同表示加载的顺序是从上到下

2. id值越大,优先级越高,越先被执行

 

select_type:表示对应的子句查询的类型

simple: 简单查询,查询不包含子查询和union

primary: 复杂查询最外层的查询

subquery: 包含再select中的子查询(不在from子句中)

derived: 包含再from子句中的子查询

union: union关键字后的select

 

table: 该子句正在访问哪个表

 

type: 表示访问类型,mysql决定如何访问表中的行,需重点关注该字段。

查询性能从优到差依次为:system > const > eq_ref > ref > range > index > all,一般来说,线上查询要到达range级别,最好是ref

system: mysql对查询的某部分转化为一个常量,用于primary key或者unique key与常量进行比较时。system是const的特例,表中只有一行数据时是system。

const: mysql对查询的某部分转化为一个常量,用于primary key或者unique key与常量进行比较时。

eq_ref: 在 join 查询中,primary key或者unique key索引被连接使用,对于每个索引键值,表中都只有一条记录匹配。

ref: 相比 eq_ref, 不适用唯一索引,而是使用普通索引,索引要和某个值相比较,可能返回多条满足条件的记录。

range: 范围扫描通常出现在the =<>>>=<<=IS NULL<=>BETWEENLIKE, or IN() 操作中,使用索引来检索给定范围的行。

index: 扫描索引得出结果,但是不使用索引过滤,类似于 select id from t1。

all: 全表扫描。

 

key_len: 显示mysql在索引中使用的字节数,通过这个值可以看出查询使用了索引中的哪些列。

1. 所有的索引字段,如果没有设置not null, 需要加1个字节

2. 定长字段,int占4个字节,date占3个字节,char(n) 占 n 个字符

3. 对于不定长字段 varchar(n), 则占 n个字符 + 2个字节

4. 不同的字符集,latin1,1个字符占1个字节;gbk编码的,1个字符占2个字节;utf8编码的,1个字符占3个字节;utf8mb4编码的,1个字符占4个字节

 

rows: mysql认为执行查询必须检查的行数,是server层的信息,对于innodb类型的表,这个值是不准确的

 

filtered: 存储引擎返回的数据在经过 server 层过滤之后,剩下满足查询条件的记录数量的比例

 

Extra:额外信息,重点关注

using Index: 使用了覆盖索引

using Index Condition Pushdown: 索引条件下推优化

using where: 使用where语句来处理查询结果,查询的列未被索引覆盖

using temporary:使用临时表来存储中间结果

using filesort:查询中包含order by排序,但是没有利用索引完成的排序操作

 

posted @ 2020-07-19 22:40  卷毛狒狒  阅读(35)  评论(0编辑  收藏