MrZyb Always in fear of one's own ignorance

MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化。EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如: EXPLAIN SELECT * from user_info WHERE id < 300; 本文主要讲解explain命令的使用及相关参数说明。

列名 说明
id 执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置
select_type 显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT)
table 表名称
type 数据访问/读取操作类型(ALL< index < range < ref < eq_ref < const/system,还有NULL)
possible_keys 可能有利于高效查找的索引
key 显示mysql决定采用哪个索引来优化查询
key_len 显示mysql在索引里使用的字节数
ref 哪个字段或常数与 key 一起被使用
rows 为了找到所需的行而需要读取的行数,估算值
Extra 额外信息

id

  • id 是用来顺序标识整个查询中SELELCT 语句的,在嵌套查询中id越大的语句越先执行。该值可能为NULL,如果这一行用来说明的是其他行的联合结果。

select_type

  • SIMPLE , 简单子查询,不包含子查询和union

  • PRIMARY , 包含union或者子查询,最外层的部分标记为primary

  • UNION , 表示此查询是 UNION 的第二或随后的查询

  • DEPENDENT UNION, UNION 中的第二个或后面的查询语句, 取决于外面的查询 UNION RESULT, UNION 的结果

  • SUBQUERY , 一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询

  • DERIVED 派生表——该临时表是从子查询派生出来的,位于form中的子查询

  • DEPENDENT SUBQUERY 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果

table

表示查询涉及的表或衍生表

type

通常来说, 不同的 type 类型的性能关系如下:

ALL < index < range ~ index_merge < ref < eq_ref < const < system

ALL 类型因为是全表扫描, 因此在相同的查询条件下, 它是速度最慢的,而 index 类型的查询虽然不是全表扫描, 但是它扫描了所有的索引, 因此比 ALL 类型的稍快。后面的几种类型都是利用了索引来查询数据, 因此可以过滤部分或大部分数据, 因此查询效率就比较高了。

  • system : 表中只有一条数据. 这个类型是特殊的 const 类型。

  • const : 针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可。

  • eq_ref : 此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高。

  • ref : 一种索引访问,它返回所有匹配某个单个值的行。此类索引访问