MySQL Explain执行结果详解







参考文档

1 id
  • select的序号列
  • 通常有几个select就有几个id(除非产生衍生表合并优化)
  • id的顺序是按select出现的顺序增长的
  • id列数字越大执行优先级越高
  • id相同则从上往下执行
  • id为NULL最后执行

MySQL中的子查询

  • select子查询
    • select与from之前的子查询语句
    • 在主from之后执行
  • from子查询
    • from和where之间的子查询
    • 在where子查询之后执行
    • from子查询执行后通常会产生临时表,也称派生表
    • 当开启衍生表的合并优化时,MySQL会启动取消或者合并from子查询
    • MySQL7默认开启衍生表合并优化
    • 关闭衍生表合并优化的方式

set session optimizer_switch='derived_merge=off';

  • where子查询
    • where之后的子查询
    • 优先执行where子查询

  • 测试SQL

explain select 
	(select name  from actor where id= a.actor_id ) a_name,
	a.* 
from (select * from film_actor where id >= 1) a
where  a.film_id =   (select id  from film where id>=1 limit 1 )

  • 执行结果为

由上观察可知,sql执行时的顺序:

where子查询>from子查询>主from查询>select子查询

2 select_type
  • simple:简单查询查询不包含子查询union

  • primary复杂查询最外层select
  • subqueryselect查询或者where子查询
  • dependent subqueryselect查询或者where子查询与主form表进行关联查询的)
  • derivdefrom子查询产生衍生表
  • 测试SQL

explain select 
	(select name  from actor where id= a.actor_id ) a_name,
	a.* ,
	(select name  from film limit 1 ) f_name
from (select * from film_actor where id >= 1) a
where  a.film_id =   (select id  from film where id>=1 limit 1 ) 
       and a.actor_id =   (select id  from actor where id=a.actor_id )

  • unionunion查询
  • union result所有查询执行合并结果

3 table
  • 将要访问表名
  • from查询table存在<derivenN>表示当前查询依赖id=N查询需要执行id=N查询

  • 使用union查询select_type为union result列table<union1..N>,表示依赖id=1..N查询执行这些查询

4 partitions

基于分区查询时,partitions字段会显示查询访问分区

5 type
  • 关联类型或者访问类型
  • 决定MySQL如何查找表中查找数据行大概范围
  • 最优最差依次
    • null > system > const > eq_ref > ref > range > index > ALL
  • 一般来说保证查询达到range级别只好达到ref
  • 以下测试SQL语句达到type级别不一定准确因为MySQL执行选择type级别数据量有一定关系通常情况下辅助索引因为数据不多而走全表扫描

5.1 null级别查询
  • 执行不需要访问
  • 查询不访问真实直接返回结果

  • 可能条件执行优化阶段发现可能有结果直接返回null

  • max,min聚合函数作用字段存在索引直接索引访问

5.2 system&const级别查询
  • 使用主键索引或者唯一索引常量等值查询
  • 最多只有一行记录返回
  • system级别一种特殊const极少出现

  • 衍生表查询优化产生system级别查询
  • 子查询生成派生表包含一行外层查询访问访问system级别

  • 主键常量等值查询产生const级别查询

  • 唯一索引常量等值查询也是const级别查询

5.3 eq_ref级别查询
  • 使用主键或者唯一索引关联查询并且主键或者唯一索引所在被驱动

5.4 ref级别查询
  • 普通索引等值查询达到ref级别

  • 联合索引使用一部分索引达到ref级别

注意此时select film_id改为select * 由于数据量会走扫描

5.5 range级别查询
  • inbetween><>=<=like范围查询
  • 查询字段需要存在索引
  • 大于范围查询达到range查询

  • 对于film只存在idname字段并且name存在索引mysql选择name index索引

因为MySQL选择索引如果辅助索引可以满足查询并且不用回表优先采用辅助索引查询

5.5 index级别查询
  • 辅助索引查询即可拿到查询结果

5.6 all级别查询
  • 需要主键索引才能拿到查询结果

6 possible_keys & key
  • possible_key为可能使用哪些索引查找
  • key选择使用索引
  • possible_key不为key由于MySQL成本计算可能
  • 可以使用force index强制使用哪个索引
  • 可以使用ignore index忽略某个索引

7 key_len
  • 当使用索引联合索引关注字段
  • 显示MySQL索引里面使用字节数
  • 根据该值可推断联合索引有几个字段生效

key_len计算规则

  • 不同字段类型占用长度不一样

字段类别

字段

占用字节

字符串

char(n)

3n

varchar(n)

3n+2

数值类型

tinyint

1

smallint

2

int

4

bigint

8

时间类型

date

3

timestamp

4

datetime

8

  • 如果字段允许为null时,则需要额外1字节记录是否null
8 ref
  • key索引查询所用到或者常量

9 rows
  • MySQL预估读取行数
  • 并不是实际读取行数
10 filtered
  • 查询条件过滤后的数据占总数据百分

11 Extra

展示额外信息常见如下

  • Using index
    • 使用辅助索引查询
    • 使用key表示索引字段进行查询
    • 并且不需要进行回表查询查询效率较快

  • Using Where
    • 使用where过滤查询
    • 使用索引字段

  • Using Index Condition
    • 使用索引查询
    • 并且索引字段范围查询
    • 如果使用索引辅助索引先通过辅助索引锁定主键范围然后回表查询主键索引

  • Using temporary
    • 需要创建临时处理查询
    • 一般都是需要优化

  • Select tables optimized away
    • 在索引字段使用max,min极值聚合函数查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值