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的输出增加。
cost表示优化器评估的成本。
rows第一个rows表示估计访问的行数, 第二个rows表示真正执行的行数
actual time时间actual time=0.048..7.194,前面的值是获取第一行所耗费的时间,第二个7.194是获取所有记录花费的时间。如果循环多次,loops大于1 ,则该值就是一次循环对应的平均时间。
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的explain analyze增强功能的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 8.0中的 explain analyze(译)
MySQL 8.0中的 explain analyze(译)
MySQL 8 查询优化新工具 Explain Analyze
PostgreSQL EXPLAIN ANALYZE 的 MySQL 等价物是啥