mysql8.0 花式查看语句执行计划

1 背景

在mysql中,当我们遇到慢语句的时候我们首先想到的就是使用explain查看索引的使用情况.那么在8.0中我们还可以怎么看呢?explain的输出结果都是什么含义呢?接下来让我们开始探索吧.

2 explain介绍

explain 可以用来查看select,delete,insert,replace,update等语句的执行计划.

2.1 查看explain的输出结果


explain输出结果

重要字段解释(更详细的解释大家可以查看官网):

ID字段:

id相同为一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。

select_type字段

1)SIMPLE:简单SELECT,不使用UNION或子查询等
2)PRIMARY:查询中若包含任何复杂的子部分,最外层的Select
3)UNION:UNION中的第二个或后面的SELECT语句
4)DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
5)UNION RESULT:从UNION表获取结果的SELECT
6)SUBQUERY:在SELECT或WHERE列表中包含了子查询
7)DEPENENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
8)DERIVED:派生表的SELECT,FROM子句的子查询,用来表示包含在from子句中的子查询
的select,mysql会递归执行并将结果放到一个临时表中。
9)UNCACHEABLE SUBQUERY:子查询结果不能被缓存,必须重新评估外连接的第一行。
10)DEPENDENT DERIVED 内部表依赖的另一个表
11)MATERIALIZED 物化的子查询
12)UNCACHEABLE UNION	在union中的第二个或者后一个所依赖的子查询不在缓存中

type字段

1 system: 这个表只有一行记录.是一个特殊的const类型

2 const:使用主键或者唯一键查询

conset展示:


3 eq_ref: 使用的索引是唯一索引,对于每个索引值,表中只有一条记录匹配

4 ref: 使用非唯一索引或者唯一索引的前缀扫描,返回匹配某个单独值的记录行

5 ref_or_null: 和ref差不多,但是需要检索null

SELECT * FROM ref_table
  WHERE key_column=expr OR key_column IS NULL;

6 range: 索引范围扫描,常见于<、<=、>、>=、between等操作符

7 index_merge: 索引合并.当没有可用的联合索引时候.每个列的索引将被合并输出结果


index_merge使用情况

8 index:俗称.全索引扫描.效率低的仅低于all

9 ALL :全表扫描.PS:兄弟.加索引吧.

key字段

key字段主要显示使用到了哪些索引

key_len 字段

key_len字段 ,我们主要关注的是,比如我们建立了一个三列的联合索引.然后从这里可以看到是不是三列索引都使用到了.但是需要我们去人工计算.8.0中加入了一种新方式.后边我们进行展示

extra字段

Backward index scan:使用了倒序索引扫描

Using filesort MySQL中无法利用索引完成的排序操作称为“文件排序”

Using temporary:表示MySQL需要使用临时表(基于内存的)来存储结果集,常见于排序和分组查询。

Using where:表示mysql服务器将在存储引擎检索行后再进行过滤。许多where条件里涉及索引中的列,当它读取索引时,就能被存储引擎检验。

Using index 只是使用索引检索出来数据了.不需要进行其他操作

Using index condition 俗称索引下推,又叫ICP.是为了减少回表查询的一种优化算法

什么情况下会使用到ICP?

a.当type字段是range,ref,eq_ref及ref_or_null时需要回表查询时则会选择ICP


b.ICP只会出现在使用二级索引查询时,可以减少全表数据的返回及IO

c.子查询无法使用到ICP


Using index for group-by:类似于使用索引查询.当mysql发现这个索引可以应用于group by或者distinct而不需要再回表查询的时候

Using index for skip scan:mysql可以使用索引扫描获取select中的所有行数据,且这个索引覆盖了所有需要的行



Using join buffer (Block Nested Loop), Using join buffer (Batched Key Access), Using join buffer (hash join):将早期联接中的表部分读入联接缓冲区,然后从缓冲区中使用他们的行来执行与当前表的联接。也就是说,将缓冲 explain 输出前一行上表中的 key,并从使用 join buffer 的行指向的表中分批提取匹配的行。

Using temporary:一般发生在语句中存在group by或者order by的时候会使用临时表

至此我们对explain的输出结果进行了解释.那么接下来让我们看看8.0中explain的其他使用方式!

3 查看执行计划的方式

使用explain format=json方式查看


查看输出

第三种查看方式:使用mysql workbench的图形化方式查看


举报
评论 0