数据库EXPLAIN

2019/06/08 数据库

数据库 EXPLAIN

explain用来解释查询语句的执行情况,是否使用到索引等等。

select version()select @@version命令可以查看数据库的版本号:

2019-06-08-数据库版本号

5.7版本下,explain查询出来的结果列如下:

2019-06-08-explain查询结果

Column Meaning
id select标识符
select_type select类型
table 表名
partitions 匹配的分区
type 查询使用到的类型
possible_keys 可能用到的索引
key 实际用到的索引
key_len 用到索引的长度
ref 列与索引进行比较
rows 估计要检查的行
filtered 按表条件过滤的百分比
Extra 额外的信息

以下是每一列具体的含义以及可能出现的值:

  • id:决定表的执行顺序,有三种情况

    • id相同,表执行顺序由上到下,与sql中顺序无关;
    • id不同,值越大优先级约高,越先被执行;
    • id有相同的也有不同的,如果相同则认为是一组,由上到下执行,多个组id值越大越先执行。
  • select_type:查询类型,5.7版本中可能有如下值

    select_type Value Meaning
    SIMPLE 简单查询,不使用union或子查询
    PRIMARY 查询中包含任何union或子查询,最外层被标记为该类型
    UNION 使用连接查询,第二个或更后面的select被标记为该类型
    DEPENDENT UNION 使用连接查询,第二个或更后面的select被标记为该类型,而且依赖于外部的查询,也就是在子查询中使用的连接查询
    UNION RESULT union查询的结果被标记为该类型
    SUBQUERY 子查询中的第一个select被标记为该类型
    DEPENDENT SUBQUERY 子查询中的第一个select被标记为该类型,而且依赖于外部的查询,也就是子查询中又包含子查询
    DERIVED from后的子查询被标记为该类型(衍生),使用内联视图,递归执行这些子查询,把结果放在临时表中
    MATERIALIZED 物化子查询
    UNCACHEABLE SUBQUERY 不可缓存的子查询,对于外层的主表,子查询不可被物化,每次需要重新计算
    UNCACHEABLE UNION 不可缓存的连接查询,连接的表不可被物化,每次需要重新计算

    对于物化 的理解:物化通过将子查询结果作为一个临时表来加快查询执行速度,正常来说是在内存中的。mysql第一次需要子查询结果时,物化结果到一张表中,在之后的任何地方需要该结果集,mysql会再次引用临时表。

  • table:表名

  • partitions:分区,为null表示该表没有分区

  • type:查询用到的类型,以下结果由上到下,效果由最好到最差

    type Value Meaning
    system 该表只有一行(等于系统表),是const类型的特例
    const 表示通过索引一次就找到了结果,用于比较主键索引或唯一性索引
    eq_ref 用于联表查询的情况,和const一样,也是只会匹配到一行
    ref 非唯一性索引扫描,返回匹配某个值的所有行
    fulltext 使用到的索引类型为全文索引
    ref_or_null 非唯一性索引的列等于某个值或为null
    index_merge where条件中用到多个索引的首列,且这些条件之间用OR连接(或的关系)
    unique_subquery 索引查找函数,可以替换IN子查询提高效率,如下格式:value IN (SELECT primary_key FROM single_table WHERE some_expr)
    index_subquery 替换IN子查询提高效率,如下格式:value IN (SELECT key_column FROM single_table WHERE some_expr)
    range 只检索给定范围的行,一般where中使用between, <, >, in等会用到这种类型
    index 全索引扫描,与all的区别为,index只遍历索引树
    All 全表扫描
  • possible_keys:可能用到的索引

  • key:实际用到的索引,如果为null则没有使用索引

  • key_len:使用到的索引的长度

  • ref:显示索引的哪一列被使用了,一般为常量或条件中用到的列

  • rows:估算出找到所需的记录所需要读取的行数,每张表有多少行被查询

  • filtered:筛选的表行数的百分比

    举例:如果rows是1000,filtered是50.00,则使用下表连接的行数为1000*50%=500

  • Extra:一些额外信息,以下为常见的信息

    Extra Value Meaning
    Using where 取出数据之后再根据条件对比
    Using index 使用索引访问数据
    Using index conditio 使用索引过滤数据
    Using temporary 使用临时表
    Using filesort 无法利用索引完成排序
    Using join buffer 将之前的数据存放在join buffer中
    Impossible WHERE 条件不成立

参考:

官网手册

MySQL执行计划初探

Search

    Table of Contents