explain字段解释

转载简书

  • select_type

simple :它表示简单的select,没有union和子查询
dependent union:union依赖外层的查询
dependent subquery:subquery依赖外层的查询

select_type 说明
SIMPLE 简单SELECT(不使用UNION或子查询)
PRIMARY 最外层的SELECT
UNION UNION中第二个或之后的SELECT语句
DEPENDENT UNION UNION中第二个或之后的SELECT语句取决于外面的查询
UNION RESULT UNION的结果
SUBQUERY 子查询中的第一个SELECT
DEPENDENT SUBQUERY 子查询中的第一个SELECT, 取决于外面的查询
DERIVED 衍生表(FROM子句中的子查询)
MATERIALIZED 物化子查询
UNCACHEABLE SUBQUERY 结果集无法缓存的子查询,必须重新评估外部查询的每一行
UNCACHEABLE UNION UNION中第二个或之后的SELECT,属于无法缓存的子查询

== DEPENDENT 意味着使用了关联子查询。==

  • table

语句中的表明,如果表有别名,则显示别名

  • partitions

  • type

这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型依次为:

system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL
type 说明
system 表中只有一行数据或者是空表,这是const类型的一个特例。且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index
const 最多只有一行记录匹配。当联合主键或唯一索引的所有字段跟常量值比较时,join类型为const。其他数据库也叫做唯一索引扫描
eq_ref 多表join时,对于来自前面表的每一行,在当前表中只能找到一行。这可能是除了system和const之外最好的类型。当主键或唯一非NULL索引的所有字段都被用作join联接时会使用此类型。eq_ref可用于使用’='操作符作比较的索引列。比较的值可以是常量,也可以是使用在此表之前读取的表的列的表达式。
ref 对于来自前面表的每一行,在此表的索引中可以匹配到多行。若联接只用到索引的最左前缀或索引不是主键或唯一索引时,使用ref类型(也就是说,此联接能够匹配多行记录)。
fulltext 使用全文索引的时候是这个类型。要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
ref_or_null 跟ref类型类似,只是增加了null值的比较。实际用的不多。
index_merge 表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取多个索引,性能可能大部分时间都不如range
unique_subquery 用于where中的in形式子查询,子查询返回不重复值唯一值,可以完全替换子查询,效率更高。该类型替换了下面形式的IN子查询的ref:
index_subquery 表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取多个索引,性能可能大部分时间都不如range
unique_subquery 用于where中的in形式子查询,子查询返回不重复值唯一值,可以完全替换子查询,效率更高。该类型替换了下面形式的IN子查询的ref:

除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引。

  • possible_keys

查询可能使用到的索引都会在这里列出来

  • key

MYSQL执行计划使用的索引

   system:表仅有一行,这是const类型的特列,平时不会出现,一般出现在mysql内建系统表中

  const :表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快

  eq_ref:对于每个来自于前面的表(连接表)的行,只从该表(被连接表)中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用于使用=比较带索引的列。

  ref :对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果不能满足只去一行的情况,会使用索引,则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。

  range :给定范围内的检索,比如 in(xx,xxxx) 或者 between

  index  :该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小,一般在使用了覆盖索引优化的情况下使用

  all: 对于每个来自于先前的表的行组合,进行完整的表扫描。

 

    index_merge:该联接类型表示使用了索引合并优化方法 常见如 :  idx1 = ? or idx2 = ?
    
  • ken_len

查询用到的索引长度(字节数)。

  • ref

和前方表连接的字段,const代表是常量值连接

  • rows

显示MYSQL执行查询的行数,简单且重要,数值越小越好

  • filtered

这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。这个字段不重要

  • Extra

   Distinct : 一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

  Range checked for each: 没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一 

  Using filesort: 发生了硬盘或内存排序,一般是由order by 或 group by触发的;典型的情况,排序的字段不是驱动表的字段,则会使用临时表将数据都添加进去,最后进行排序,如果数据大则硬盘排序,如果小则内存排序.

  Using index :列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,使用了覆盖索引优化

  Using temporary :使用了临时表,通常和filesort一起发生. 典型情况:使用了派生表.

  Using where: 数据库服务层从存储引擎提取了数据又进行了一次条件过滤

  using index condition: ICP优化,5.6之后提供.将过滤条件下推到存储引擎层执行,能更好的利用复合索引来过滤数据,减少IO.

    Using index for group-by:使用了松散索引扫描

你可能感兴趣的:(数据库)