暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql学习——执行计划

RafeNote 2021-09-07
600

一、什么是执行计划


Mysql对sql语句解析和优化完成后,会生成一个执行计划,执行计划说明了这条sql语句具体的执行的方式。我们可以使用Explain语句来查询相应的执行计划。

我们可以看到返回了一个表,这个表就是具体的执行计划说明。


二、输出的各项列是什么


1.table,explain语句输出的每条记录都对应着访问某个表,table则是访问表的表名。如下图:




2.id,每一个查询语句都至少有一个“select”关键字,查询语句中每出现一个“select”关键字,就会被分配一个唯一的id,如果有一个“select”关键字,而from后有两个表,就会产生两条记录,但id是相同的。如下图:



3.select_type,每个“select”都代表了一种查询,而select_type则是说明了在一个大的查询语句中中,某个select的查询扮演了什么角色。select_type可取的值如下:


  • SIMPLE:查询语句中不包含UNION或者子查询的查询。(UNION是一个操作符,用来合并两个或多个“select”语句的结果集,结果还会去重)

  • PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY。(UNION ALL 和UNION功能差不多,但是不会对结果去重)

  • UNION:对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION。

  • UNION RESULT:MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULT

  • SUBQUERY:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询时,该子查询的第一个SELECT关键字代表的那个查询的select_type就是SUBQUERY。

  • DEPENDENT SUBQUERY:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY。

  • DEPENDENT UNION:在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION。

  • DERIVED:采用物化的方式执行的包含派生表的查询。

  • MATERIALIZED:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的select_type属性就是MATERIALIZED。


4.type,执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问方法是什么。可以取的值:


  • system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system。

  • const:当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const。

  • eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref。

  • ref:当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref。

  • ref_or_null:当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null。

  • index_merge:使用索引合并的方式查询。

  • unique_subquery:类似于两表连接中被驱动表的eq_ref访问方法,unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type列的值就是unique_subquery。

  • index_subquery:与unique_subquery类似,只不过访问子查询中的表时使用的是普通的索引。

  • range:如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法。

  • index:当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是index。


5.possible_keyskey:possible_keys列表示在某个查询语句中,对某个表执行单表查询时可能用到的索引有哪些,key列表示实际用到的索引有哪些。


6.key_len:表示当优化器决定使用某个索引执行查询时,该索引记录的最大长度。


7.ref:当使用索引列等值匹配的条件去执行查询时,也就是在访问方法是const、eq_ref、ref、ref_or_null、unique_subquery、index_subquery其中之一时,ref列展示的就是与索引列作等值匹配的数据是个啥,比如只是一个常数或者是某个列。


8.rows:如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数。


9.filtered列就代表查询优化器预测在这要扫描的记录中,有多少条记录满足其余的搜索条件。


10.extra:用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句。

文章转载自RafeNote,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论