MySQL的explain analyze增强功能

Posted bisal(Chen Liu)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的explain analyze增强功能相关的知识,希望对你有一定的参考价值。

我们排查关系型数据库的SQL性能问题时,执行计划是重要的手段之一,看执行计划有很多种方法,Oracle可以参考《查询执行计划的几种方法》、《获取执行计划的方法对比》,mysql可以参考《查看MySQL执行计划的几种方法以及格式说明》。

杨老师推送的这篇文章《explain analyze 查看执行计划》,给我们介绍了MySQL 8.0中explain analyze的相关问题。

MySQL 8.0对如何查看MySQL的执行计划做了2次改进,第一个是explain format=tree,提供树状的SQL执行过程,提供更通俗易懂的算法逻辑,到8.0.18版本有开始提供新的查看执行计划的用法,就是explain加上关键字  explain analyze,相比format=tree的方式新增加时间和循环相关统计。

纸上来得终觉浅,绝知此事要躬行。

构建测试用例两张表,并插入数据,

CREATE TABLE `x` (
  `id` int NOT NULL AUTO_INCREMENT,
  `a` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30005 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

###  x 12010 行数据

 CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `a` int DEFAULT NULL,
  `c` int DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31186 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

### t2 10000 行数据。
查看explain format=tree

通过format=tree的方式可以查看到优化器的执行计划,标准的NL,全表扫描,因为select a.id,访问表x时使用了覆盖索引访问主键id,并没有访问a的其他字段,而t2表的字段c,用不了覆盖索引,

mysql [localhost:8031] msandbox (test) > explain format=tree  select a.id, b.c from  x a ,t2 b where a.id=b.id ;
+-------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                          |
+-------------------------------------------------------------------------------------------------+
| -> Nested loop inner join  (cost=4505.00 rows=10000)
    -> Table scan on b  (cost=1005.00 rows=10000)
    -> Single-row covering index lookup on a using PRIMARY (id=b.id)  (cost=0.25 rows=1)
 |
+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

执行计划显示NL join的成本是4505 ,一次nest loop访问了10000行。这些内容不能表明查询计划实际上是在哪些操作上花费的时间。

explain analyze将执行以下操作

相比format=tree的方式和老的explain的方式,analyze的输出增加。

  1. cost表示优化器评估的成本。

  2. rows第一个rows表示估计访问的行数, 第二个rows表示真正执行的行数

  3. actual time时间actual time=0.048..7.194,前面的值是获取第一行所耗费的时间,第二个7.194是获取所有记录花费的时间。如果循环多次,loops大于1 ,则该值就是一次循环对应的平均时间。

  4. loops循环次数。本案例中最里面的loops=10000表示循环访问表a 10000次。

mysql [localhost:8031] msandbox (test) > explain analyze  select a.id, b.c from  x a ,t2 b where a.id=b.c ;
+-----------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+-----------------------------------------------------------------------------------------------------------------+
| -> Nested loop inner join  (cost=4505.00 rows=10000) (actual time=0.048..7.194 rows=10000 loops=1)
    -> Filter: (b.c is not null)  (cost=1005.00 rows=10000) (actual time=0.038..2.269 rows=10000 loops=1)
        -> Table scan on b  (cost=1005.00 rows=10000) (actual time=0.037..1.719 rows=10000 loops=1)
    -> Single-row covering index lookup on a using PRIMARY (id=b.c)  (cost=0.25 rows=1) (actual time=0.000..0.000 rows=1 loops=10000)
 |
+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

explain的三种用法,

检查查询计划:explain format = tree
分析查询执行:explain analyze 
了解计划选择:Optimizer trace

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,

近期更新的文章:

MySQL的审计功能实现方案

"--"注释在Oracle和MySQL下的区别

最近碰到的一些问题

1024的一个小福利

Oracle 19c对VARCHAR2的限制

近期的热文:

"红警"游戏开源代码带给我们的震撼

文章分类和索引:

公众号1100篇文章分类和索引

以上是关于MySQL的explain analyze增强功能的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 8.0中的 explain analyze(译)

MySQL 8.0中的 explain analyze(译)

MySQL 8 查询优化新工具 Explain Analyze

PostgreSQL EXPLAIN ANALYZE 的 MySQL 等价物是啥

PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 等价物是啥

14.1.2. EXPLAIN ANALYZE