MySQL Explain详解

MySQL Explain详解

简介

执行计划(query Execution plan)segmentfault

语法

explain select * from table缓存

explain 中的列

expain出来的信息有10列,
分别是id,select_type,table、type,partitions,possible_keys,key,key_len,ref,rows,Extra,下面对这些字段出现的可能进行解释:性能

1、ID

SQL执行的顺序的标识,SQL从大到小的执行优化

  1. ID相同时,执行顺序由上至下
  2. 若是是子查询,ID的序号会递增,ID值越大优先级越高,越先被执行
  3. ID若是相同,能够认为是一组,从上往下顺序执行;在全部组中,ID值越大,优先级越高,越先执行

2、select_type

示查询中每一个select子句的类型code

  1. SIMPLE:简单的SELECT,不实用UNION或者子查询。
  2. PRIMARY:最外层SELECT。
  3. UNION:第二层,在SELECT以后使用了UNION。
  4. DEPENDENT UNION:UNION语句中的第二个SELECT,依赖于外部子查询。
  5. UNION RESULT:UNION的结果。
  6. SUBQUERY:子查询中的第一个SELECT。
  7. DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询。
  8. DERIVED:导出表的SELECT(FROM子句的子查询)
  9. MATERIALIZED:物化子查询
  10. UNCACHEABLE SUBQUERY:没法缓存结果的子查询,必须为外部查询的每一行从新计算
  11. UNCACHEABLE UNION:UNION 属于不可缓存的子查询的第二个或后一个选择

3、table

输出行引用的表的名称。这也能够是如下值之一:索引

  • <unionM,N,...>:该行指的是id值为M和id值为N的并集。
  • <derivedN>:该行是指用于与该行的派生表结果id的值 N。例如,派生表能够来自FROM子句中的子查询
  • <subqueryN>:该行指的是id 值为的行的具体化子查询的结果N
4、type

表示MySQL在表中找到所需行的方式,又称“访问类型”。get

经常使用的类型有: NULL, system, const, eq_ref, ref, range, index, ALL(从左到右,性能从差到好)
如下列表描述了从最佳类型到最差类型的链接类型it

  • NULL
    MySQL在优化过程当中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值能够经过单独索引查找完成。
  • system
    该表只有一行(如:系统表)。这是const链接类型的特例
  • const
    该表最多只有一个匹配行,在查询开头读取。由于只有一行,因此优化器的其他部分能够将此行中列的值视为常量。 const表很是快,由于它们只读一次。io

    ```SELECT * FROM tbl_name WHERE primary_key=1; SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2; ```
  • eq_ref
    对于前面表格中的每一个行组合,从该表中读取一行。除了 system和 const类型以外,这是最好的链接类型。当链接使用索引的全部部分且索引是 索引PRIMARY KEY或UNIQUE NOT NULL索引时使用它。table

    ```SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column; SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1; ```
  • ref
    表示上述表的链接匹配条件,即哪些列或常量被用于查找索引列上的值
  • fulltext
    使用FULLTEXT 索引执行链接。
  • ref_or_null

    ```SELECT * FROM ref_table WHERE key_column IS NULL; ```
  • index_merge
    该指数合并访问方法检索与多行 range扫描和他们的结果合并到一个。此访问方法仅合并来自单个表的索引扫描,而不扫描多个表。合并能够生成其基础扫描的联合,交叉或交叉联合

    ```SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20; SELECT * FROM tbl_name WHERE (key1 = 10 OR key2 = 20) AND non_key = 30; SELECT * FROM t1, t2 WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%') AND t2.key1 = t1.some_col; SELECT * FROM t1, t2 WHERE t1.key1 = 1 AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2); ```
  • unique_subquery
    此类型替换 如下形式的eq_ref某些 IN子查询:

    ```value IN (SELECT primary_key FROM single_table WHERE some_expr) ```
  • index_subquery
    此链接类型相似于 unique_subquery。它替换IN子查询,但它适用于如下形式的子查询中的非惟一索引:

    ```value IN (SELECT key_column FROM single_table WHERE some_expr) ```
  • range
    仅检索给定范围内的行,使用索引选择行。的key 输出行中的列指示使用哪一个索引。将key_len包含已使用的时间最长的关键部分。该ref列 NULL适用于此类型。
    range当一个键柱使用任何的相比于恒定可以使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE,或 IN()运营商:
  • index
    该index联接类型是同样的 ALL,只是索引树被扫描。这种状况有两种:

    1. 若是索引是查询的覆盖索引,而且可用于知足表中所需的全部数据,则仅扫描索引树。在这种状况下,Extra专栏说 Using index。仅索引扫描一般比ALL索引的大小一般小于表数据更快 。
    2. 使用索引中的读取执行全表扫描,以按索引顺序查找数据行。 Uses index没有出如今 Extra列中。当查询仅使用属于单个索引的列时,MySQL可使用此链接类型。
  • ALL
    对前面表格中的每一个行组合进行全表扫描。若是表是第一个未标记的表 const,一般很差,而且在全部其余状况下一般 很是糟糕。一般,您能够ALL经过添加基于常量值或早期表中的列值从表中启用行检索的索引来避免
5、possible_keys

该possible_keys列指示MySQL能够选择在此表中查找行的索引,指出MySQL能使用哪一个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不必定被查询使用

该列彻底独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
若是该列是NULL,则没有相关的索引。在这种状况下,能够经过检查WHERE子句看是否它引用某些列或适合索引的列来提升你的查询性能。若是是这样,创造一个适当的索引而且再次用EXPLAIN检查查询

6、Key

key列显示MySQL实际决定使用的键(索引)

若是没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

7、key_len

表示索引中使用的字节数,可经过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并不是实际使用长度,即key_len是根据表定义计算而得,不是经过表内检索出的)

不损失精确性的状况下,长度越短越好

8、ref

表示上述表的链接匹配条件,即哪些列或常量被用于查找索引列上的值

9、rows

表示MySQL根据表统计信息及索引选用状况,估算的找到所需的记录所须要读取的行数

10、Extra

该Extra列 EXPLAIN输出包含MySQL解决查询的额外信息。如下列表说明了此列中可能出现的值。每一个项目还指示JSON格式的输出哪一个属性显示Extra值。对于其中一些,有一个特定的属性。其余显示为message 属性的文本

11、partitions(扩展)

记录将与查询匹配的分区。仅在使用PARTITIONS关键字时才显示此列 。非分区表显示null

来源:https://segmentfault.com/a/1190000017751405

相关文章
相关标签/搜索