关于mysql8:新特性解读-MySQL-80explain-analyze-分析-SQL-执行过程

31次阅读

共计 2380 个字符,预计需要花费 6 分钟才能阅读完成。

作者:胡呈清

爱可生 DBA 团队成员,善于故障剖析、性能优化,集体博客:https://www.jianshu.com/u/a95…,欢送探讨。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


介绍

MySQL 8.0.16 引入一个试验个性:explain format=tree,树状的输入执行过程,以及预估老本和预估返回行数。在 MySQL8.0.18 又引入了 EXPLAIN ANALYZE,在 format=tree 根底上,应用时,会执行 SQL,并输入迭代器(感觉这里用“算子”更容易了解)相干的理论信息,比方执行老本、返回行数、执行工夫,循环次数。

文档链接:https://dev.mysql.com/doc/ref…

示例:

mysql> explain format=tree SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10);
*************************** 1. row ***************************
  -> Nested loop inner join  (cost=4.95 rows=9)
    -> Filter: (`<subquery2>`.b is not null)  (cost=2.83..1.80 rows=9)
        -> Table scan on <subquery2>  (cost=0.29..2.61 rows=9)
            -> Materialize with deduplication  (cost=3.25..5.58 rows=9)
                -> Filter: (t2.b is not null)  (cost=2.06 rows=9)
                    -> Filter: (t2.id < 10)  (cost=2.06 rows=9)
                        -> Index range scan on t2 using PRIMARY  (cost=2.06 rows=9)
    -> Index lookup on t1 using a (a=`<subquery2>`.b)  (cost=2.35 rows=1)
1 row in set (0.01 sec)

mysql> explain analyze SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE id < 10)\G
*************************** 1. row ***************************
  -> Nested loop inner join  (cost=4.95 rows=9) (actual time=0.153..0.200 rows=9 loops=1)
    -> Filter: (`<subquery2>`.b is not null)  (cost=2.83..1.80 rows=9) (actual time=0.097..0.100 rows=9 loops=1)
        -> Table scan on <subquery2>  (cost=0.29..2.61 rows=9) (actual time=0.001..0.002 rows=9 loops=1)
            -> Materialize with deduplication  (cost=3.25..5.58 rows=9) (actual time=0.090..0.092 rows=9 loops=1)
                -> Filter: (t2.b is not null)  (cost=2.06 rows=9) (actual time=0.037..0.042 rows=9 loops=1)
                    -> Filter: (t2.id < 10)  (cost=2.06 rows=9) (actual time=0.036..0.040 rows=9 loops=1)
                        -> Index range scan on t2 using PRIMARY  (cost=2.06 rows=9) (actual time=0.035..0.038 rows=9 loops=1)
    -> Index lookup on t1 using a (a=`<subquery2>`.b)  (cost=2.35 rows=1) (actual time=0.010..0.010 rows=1 loops=9)
1 row in set (0.01 sec)

能够看出 explain format=tree 与传统的执行打算相比,展现了比拟清晰的执行过程。而 explain analyze 则会在此基础上多输入理论的执行工夫、返回行数和循环次数。

浏览程序

  1. 从右到左:没有遇到并列的迭代器之前,都是从左边开始执行;
  2. 从上到下:遇到并列的迭代器,都是上边的先开始执行

上述示例浏览程序如下图(留神最好不要 \G 输入,否则第一行的缩进不精确),SQL 的执行程序为:

  1. 应用 Nested loop inner join 算法;
  2. t2 先取数据(Index range scan)、筛选(Filter)、物化成长期表(Materialize),作为驱动表;
  3. 将驱动表数据带入到 t1 进行查问(Index lookup on t1),循环执行 9 次。

重要信息

以上面为例:

Index lookup on t1 using a (a=`<subquery2>`.b)  (cost=2.35 rows=1) (actual time=0.015..0.017 rows=1 loops=9)

cost

预估的老本信息,计算比较复杂。如果想理解,能够查看:explain format=json 详解

rows

第一个 rows 是预估值,第二个 rows 是理论返回行数。

actual time

“0.015..0.017”,留神这里有两个值,第一个值是获取第一行的理论工夫,第二个值获取所有行的工夫,如果循环了屡次就是均匀工夫,单位毫秒。

loops

因为这里应用了 Nested loop inner join 算法,依照浏览程序,t2 是驱动表,先进行查问被物化成长期表;t1 表做为被驱动表,循环查问的次数是 9 次,即 loops=9。

正文完
 0