[mysql 详解]mysql explain 使用详解

explain 简介#

MySQL 提供了一个 EXPLAIN 命令,它可以对 SELECT 语句进行分析,并输出 SELECT 执行的详细信息,以供开发人员针对性优化.

输出格式(字段)#

  • id
  • select_type
  • table
  • partitions
  • type
  • possible_keys
  • ket
  • ref
  • rows
  • filtered
  • extra

select_type#

表示查询类型

  • SIMPLE
    查询不包含 union 和子查询
  • PRIMARY
    最外层的查询
  • UNION
    UNION 的第二或者随后的查询
  • DEPENDENT UNION
    union 的第二个或者后面的查询语句
  • UNION RESULT
    union 的结果
  • SUBQUERY
    子查询中第一个 select
  • DENPENDENT SUBQUERY
    子查询中第一个 select ,取决于外面的查询

table#

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

type#

判断查询是全表查询还是索引扫描

  • system

    表中只有一条数据,特殊的 const 类型

  • const

    针对主键或这唯一索引查询,最多返回一条数据。

  • eq_ref

    多表 join 查询,表示前表都能匹配到后表的结果

  • ref

    使用了最左前缀规则索引的查询(针对于非唯一或者非主键索引)

  • range

    表示使用索引范围查询,当 type 是 range 时,那么 EXPLAIN 输出的 ref 字段为 NULL, 并且 key_len 字段是此次查询中使用到的索引的最长的那个

  • index

    全索引扫描(扫描所有的索引)

index 类型通常出现在:所要查询的数据直接在索引树中就可以获取到,而不需要扫描数据。当是这种情况时,Extra 字段 会显示 Using index.

  • all

    全表扫描

性能比较#

==system 》 const 》 eq_ref 》 ref 》 range 》 index 》 all==

possible_keys#

查询时可能使用的索引。

key#

查询中真正使用的索引

ken_len#

查询优化器使用了索引的字节数。评估组合是否完全使用,或者只有最左部分被使用。

rows#

MySQL 查询优化器根据统计信息,估算 SQL 要查找到结果集需要扫描读取的数据行数.
这个值非常直观显示 SQL 的效率好坏,原则上 rows 越少越好.

Extra#

  • Using filesort

    表示 MySQL 需额外的排序操作,不能通过索引顺序达到排序效果

  • Using index

    “覆盖索引扫描”, 表示查询在索引树中就可查找所需数据,不用扫描表数据文件,往往说明性能不错

  • Using temporary

    查询有使用临时表,一般出现于排序,分组和多表 join 的情况,查询效率不高,建议优化.

最左前缀匹配#

在 mysql 建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配

  • 索引的字段可以是任意顺序的
以下两种都能走索引 :
KEY test_col1_col2_col3 on test(col1,col2,col3);

SELECT * FROM test WHERE col1=1AND clo2=2SELECT * FROM test WHERE col2=2AND clo1=1
  • 遇到范围查询时,就停止索引的匹配

参考#

MySQL 性能优化神器 Explain 使用分析

Mysql 联合索引最左匹配原则

本作品采用《CC 协议》,转载必须注明作者和本文链接