explain分析

 
各个属性的含义

  id

  select查询的序列号

  select_type

  select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

DEPENDENT SUBQUERY:子查询内层的第一个SELECT,依赖于外部查询的结果集。

DEPENDENT UNION:子查询中的UNION,且为UNION中从第二个SELECT开始的后面所有SELECT,同样依赖于外部查询的结果集。

PRIMARY:子查询中的最外层查询,注意并不是主键查询。

SIMPLE:除子查询或UNION之外的其他查询。

SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。

UNCACHEABLE SUBQUERY:结果集无法缓存的子查询。

UNION:UNION语句中第二个SELECT开始后面的所有SELECT,第一个SELECT为PRIMARY。

UNION RESULT:UNION 中的合并结果。


  table

  输出的行所引用的表。

  type

  联合查询所使用的类型。

  type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

  system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

type=const表示通过索引一次就找到了;

  key=primary的话,表示使用了主键;

  type=all,表示为全表扫描;

  key=null表示没用到索引。

      type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF。

System 系统表,表中只有一行数据

const 读常量,最多只会有一条记录匹配,由于是常量,实际上只须要读一次

eq_ref 最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问

ref Join语句中被驱动表索引引用的查询

ref_or_null 与ref的唯一区别就是在使用索引引用的查询之外再增加一个空值的查询。

index_merge 查询中同时使用两个(或更多)索引,然后对索引结果进行合并(merge),再读取表数据

unique_subquery 子查询中的返回结果字段组合是主键或唯一约束

index_subquery 子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引

index(对于当前的每一行,都通过查询索引来得到数据),

all(对于当前的每一行,都通过全表扫描来得到数据))

一般来说,得保证查询至少达到range级别,最好能达到ref。

 

  possible_keys

  指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

  key

  MySQL Query Optimizer 从 possible_keys 中所选择使用的索引

  key_len

  显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。

  ref

  列出是通过常量(const),还是某个表的某个字段(如果是join)来过滤(通过key)的

  rows

  这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。

  Extra  查询中每一步实现的额外细节信息,主要会是以下内容

Distinct:查找distinct 值,当mysql找到了第一条匹配的结果时,将停止该值的查询,转为后面其他值查询。

Full scan on NULL key:子查询中的一种优化方式,主要在遇到无法通过索引访问null值的使用。

Range checked for each record (index map: N):通过 MySQL 官方手册的描述,当 MySQL Query Optimizer 没有发现好的可以使用的索引时,如果发现前面表的列值已知,部分索引可以使用。对前面表的每个行组合,MySQL检查是否可以使用range或 index_merge访问方法来索取行。

SELECT tables optimized away:当我们使用某些聚合函数来访问存在索引的某个字段时,MySQL Query Optimizer 会通过索引直接一次定位到所需的数据行完成整个查询。当然,前提是在 Query 中不能有 GROUP BY 操作。如使用MIN()或MAX()的时候。

Using filesort:当Query 中包含 ORDER BY 操作,而且无法利用索引完成排序操作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。

  1. Using where:表示因为包含索引中不存在的数据,所以优化器需要通过索引回表查询数据;

  2. Using index:表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表;

  3. Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown);
    Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行;

Using index for group-by:数据访问和 Using index 一样,所需数据只须要读取索引,当Query 中使用GROUP BY或DISTINCT 子句时,如果分组字段也在索引中,Extra中的信息就会是 Using index for group-by。

Using temporary:当 MySQL 在某些操作中必须使用临时表时,在 Extra 信息中就会出现Using temporary 。主要常见于 GROUP BY 和 ORDER BY 等操作中。

Using where with pushed condition:这是一个仅仅在 NDBCluster存储引擎中才会出现的信息,而且还须要通过打开 Condition Pushdown 优化功能才可能被使用。控制参数为 engine_condition_pushdown 。

Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 通过收集到的统计信息判断出不可能存在结果。

No tables:Query 语句中使用 FROM DUAL或不包含任何 FROM子句。

Not exists:在某些左连接中,MySQL Query Optimizer通过改变原有 Query 的组成而使用的优化方法,可以部分减少数据访问次数。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值