当前位置:网站首页>MySQL(八) — 执行计划(Explain)详解

MySQL(八) — 执行计划(Explain)详解

2022-06-23 06:23:00 坏蛋呆呆

目录

执行计划

执行计划的作用

执行计划如何使用

执行计划内容

id

select_type

table

type

possible_keys

key

key_len

ref

rows

extra


执行计划

执行计划的作用

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引可以使用
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询

执行计划如何使用

explain  <sql语句>

如 explain  select * from test;

执行计划内容

id

id是select查询的序列号,包含一组数字,表示查询中执行select子语句或操作表的顺序。

三种情况:

1、id相同,执行顺序由上至下。

2、id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。

3、id中相同和不同同时存在。

select_type

select_type是指查询的类型,主要用于区分普通查询、联合查询、子查询等复杂查询。

  • SIMPLE:简单的select查询,查询中不包含子查询或者union。
  • PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记位PRIMARY。
  • SUBQUERY:在select或where列表中包含了子查询。
  • DERIVED:在From列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放到临时表中。
  • UNION:若第二个select出现在union之后,则标记为union;若union包含在from子句的子查询中,外层select则被标记为DERIVED。

  • UNION RESULT:从union表获取结果的select。

table

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

type

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

  • system:表只有一行记录(等于系统表),这是const类型的特例,平时基本不会出现。
  • const:表示通过索引一次就找到了。const用于比较primary key或unique索引。因为只匹配一行数据,所以很快。
  • eq_ref:唯一性索引扫描,对于每个索引列,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  • ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该属于查找和扫描的结合体。
  • range:只检索给定范围的行,使用一个索引来选择行。key列显示使用哪个索引。一般就是在where语句中出现了between、<、>、in等查询。这种索引扫描比全表扫描要好,因为它开始于索引的某一点,结束语另一点,不需要扫描全部索引。
  • all:遍历全表。

possible_keys

表示可能会用到的索引。

key

key表示实际使用到的索引。如果为null,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重叠。

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

  • key_len表示索引使用的字节数。
  • 根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。
  • char和varchar跟字符编码也有密切的联系。
  • latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)。

ref

表示哪些列或常量被用于查找索引列上的值;显示索引的哪一列被使用了,如果可能的话,最好是一个常数。

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。

extra

Extra表示包含不适合在其他列中显示但十分重要的额外信息。

  • Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。
  • Using temporary:使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。
  • Using index:是否使用了覆盖索引。
  • Using where:表明使用了where过滤。
  • Using join buffer:使用了连接缓存。
  • Impossible where:where子句的值总是false,不能用来获取任何元组。
原网站

版权声明
本文为[坏蛋呆呆]所创,转载请带上原文链接,感谢
https://blog.csdn.net/huaidandaidai1/article/details/95030507