MySQL-explain

select_type

显示了对应行是简单还是复杂select,simple意味着不包括子查询和union,如果查询有任何复杂的子部分,则最外层部分标记为PRIMARY,其他部分标记有如下几种

SUBQUERY:包含在列表中的子查询中的select(不在FROM子句中)。

DERIVED:DERIVED值用来表示包含在FROM子句的子查询中的SELECT,MySQL会递归执行并将结果放到一个临时表中,服务器内部称其’派生表’,因为该临时表是从子查询中派生来的

UNION:第一个selet被标记就好像它以部分外查询来执行,所以显示为PRIMARY,如果UNION被FROM子句中的子查询包含,那么它的第一个selet会被标记为DERIVED

UNION RESULT:用来从 UNION的匿名临时表检索结果的SELECT被标记为UNION RESULT.除了这些值,SUBQUERY和UNION还可以被标记为DEPENDENT和UNCACHEABLE,DEPENDENT意味着SELECT依赖于外层查询中发现的数据,UNCACHEABLE意味着SELECT中的某些特性阻止结果被缓存于一个Item_cache中。

table

显示了对应行正在访问哪个表或表别名,可以在这一列从上往下观察MySQL的关联优化器为查询选择的关联顺序

type

访问类型,MySQL决定如何查找表中的行,下面是最重要的访问方法,依次从最差到最优
ALL:
全表扫描,MySQL必须扫描整张表,从头到尾,去找到需要的行。(这里有个例外,在查询里使用limit或在Extra列中显示”Using distinct/not exists”)

index :
跟全表扫描一样,只是MySQL扫描表时按索引次序进行而不是行,它的主要优点是避免了排序,最大的缺点是要承担按索引次序读取整个表的开销,这通常意味着若是按随机次序访问行,开销将会非常大。如果在Extra列中看到’Using index’,说明MySQL正在使用覆盖索引,它只扫描索引的数据,而不是按索引次序的每一行,它比按索引次序全表扫描的开销要小很多。

range:
范围扫描就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行,这比全索引扫描好一些,因为用不着遍历全部索引

ref:
这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行.然而它可能会找到多个符号条件的行,因此它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或唯一性索引的非唯一性前缀时才会发生,把它叫做ref是因为索引要跟某个参考值相比较,这个参考值或者是一个常数或者是来自多表查询前一个表里的结果值。
ref_or_null 是ref之上的一个变体,它意味着MySQL必须在初次查找的结果里进行第2次查找以找出null条目。

eq_ref
使用这种索引,MySQL知道最多只返回一条符合条件的记录。这种访问方法可以在MySQL使用主键或唯一性索引查找时看到,它会将他们与某个参考值作比较。MySQL对 于这类访问类型的优化做的非常好,因为它知道无须估计匹配行的范围或在找到匹配行后再继续查找。

const,system
当MySQL能对查询的某部分进行优化并将其转换成一种常量时,他就会使用这些访问类型。例如,如果你通过将某一行的主键放入where子句里的方式来选取此行的主键,
MySQL就能将这个查询转换为一个常量,然后就可以高效的将表从联接执行中移除。

NULL
这种访问方式意味着MySQL能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引,如从一个索引里选取最小值可以通过单独查找索引来完成,不需要在执行时访问表。

possible_keys

显示了查询可以使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的,这个列表是在优化过程的早期创建的,因此有些罗列出来的索引可能对于后续优化过程是没用的

key

显示了MySQL决定采用哪个索引来优化对该表的访问,如果该索引没有出现在possible_key列中,那么MySQL选用它是出于另外的原因,如它可能选择了一个覆盖索引, 哪怕没有where子句。换句话说,possible_key揭示了哪一个索引能有助于高效的行查找,而key显示的是优化采用哪一个索引可以最小化查询成本

key_len

该列显示了MySQL在索引里使用的字节数

ref

显示了之前的表在key列记录的索引中查找值所用的列或常量

rows

MySQL估计为了找到所需的行而要读取的行数

filtered

显示的是针对表里符合某个条件(where子句或关联条件)的记录数的百分比所做的一个悲观估算

extra

这一列包含的是不适合在其他列显示的额外信息,常见的最重要的值如下
Using index:
表示MySQL将使用覆盖索引,以避免访问表。

Using where:
表示MySQL服务器将在存储引擎检索行后在进行过滤

Using tempory:
表示MySQL在对查询结果排序时会使用一个临时表

Using filesort
表示MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行

Range checked for each record(index map:N)
表示没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列表中索引的位图,并且是冗余的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值