[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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!