Explain使用简介

Explain之id(重点)

select查询的一组序列号,表示查询中执行select子句或者操作表的顺序。

  1. id相同,执行顺序由上至下。
  2. id不同,id越大优先级越高,越先被执行。
    Explain使用简介
  3. id相同不同,同时存在。id越大优先级越高,约先执行;id相同,顺序执行。Explain使用简介

Explain之select_type

Explain使用简介

  1. SIMPLE
    简单查询,查询中不包含自查询或者UNION
  2. PRIMARY
    查询中包含子查询,最外层查询标记为PRIMARY
  3. SUBQUERY
    子查询
  4. DERIVED
    from列表中出现子查询被标记为DERIVED,mysql会将查询结果放在临时表中。
  5. UNION
    如果第二个select出现在UNION之后,则被标记为UNION
    如果UNION包含在from子句的子查询中,则外层SELECT被标记为:DERIVED
  6. UNION RESULT
    从UNION表获取结果的SELECT

Explain之table

显示这一行数据是关于哪张表的。

Explain之type(重点)

显示查询用了何种类型。

从最好到最差依次是:
system>const>eq_ref>ref>range>index>all
一般来说,最少达到range级别。

  1. system
    表中只有一行记录
  2. const
    表示通过索引一次就找到了,用于主键索引/唯一索引。因为只匹配一行记录,所以很快。比如将主键置于where条件。
  3. eq_ref
    唯一性索引扫描,对于每个索引键,表中只有一条记录匹配。常见主键索引/唯一索引。
  4. ref
    非唯一性索引扫描,返回匹配单个值的所有行。
  5. range
    只检索给定范围的行,使用一个索引来选择行。
    一般就是你的where语句中出现了between/in等查询。
    这种范围扫描索引比全表扫描好,因为只需要开始与索引的某一行,结束与某一行,不用扫描全部索引。
  6. index
    index和all的区别在于,index只遍历索引树,通常比all快,因为索引文件比数据文件小。
    (虽然index和all都是全表读,但是index是从索引中读取,all是从硬盘读取)
  7. all
    遍历全表找到匹配行。

Explain之possible_keys

显示可能应用在这个表的索引,一个或多个。
查询涉及到的字段上若存在索引,将会被列出。但是实际上未必使用。

Explain之key(重点)

实际使用到的索引。如果是NULL,则没有使用索引。
若查询用使用到了覆盖索引,则该索引仅出现在key列表中。

Explain之key_len

表示索引中使用的字节数,可通过该列计算出查询中使用索引的长度。

Explain之ref

显示索引中哪一列被使用了,如果可能的话,是一个常数。

Explain之rows(重点)

大致估算出查出所需记录需要读取的行数。

Explain之Extra(重点)

  1. using filesort
    说明mysql会对数据使用一个外部的索引排序,而不是按着表内索引顺序。mysql无法利用索引完成的排序成为“文件排序”
    Explain使用简介
  2. using temporary
    使用临时表保存中间结果,mysql在对查询结果排序的时候使用临时表。常见于order by /group by。
    Explain使用简介
  3. using index
    表示使用到了覆盖索引。
    如果同时出现using where,表示索引被用来执行索引键值的查找。
    如果没有出现using where,表示索引被用来读取数据。
    Explain使用简介

来源:https://www.bilibili.com/video/BV1mt411g7r4?p=200

上一篇:【DB笔试面试599】在Oracle中,如何在不执行SQL的情况下获取执行计划?


下一篇:BI系统里的数据赋能与业务决策:问题诊断篇