MySQL 8.0:explain analyze 分析 SQL 执行过程

devtools/2024/12/28 11:33:27/

介绍

MySQL 8.0.16 引入一个实验特性:explain format=tree ,树状的输出执行过程,以及预估成本和预估返 回行数。在 MySQL 8.0.18 又引入了 EXPLAIN ANALYZE,在 format=tree 基础上,使用时,会执行 SQL ,并输出迭代器(感觉这里用“算子”更容易理解)相关的实际信息,比如执行成本、返回行数、 执行时间,循环次数。

文档链接:https://dev.sql>mysql.com/doc/refman/8.0/en/explain.html#explain-analyze

示例:

sql">sql>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
sql">sql>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 次

重要信息

以下面为例:

sql">Index lookup on t1 using a (a=``.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


http://www.ppmy.cn/devtools/146098.html

相关文章

mysql慢查询

一、通过日志查看慢查询 慢查询就是超出了正常查询时间的语句 1、开启慢查询日志 mysql> set global slow_query_log1;2、定义时间SQL查询的超时时间&#xff08;如果某天语句执行时间超过了0.005秒&#xff0c;就定义为慢查询语句&#xff09; mysql> set global long…

视频字幕生成工具(类似 MemoAI)简介

视频字幕生成工具,像你提到的那样,利用 机器学习 和 自然语言处理 技术来为视频内容自动生成字幕,并支持多种语言的翻译。这些工具在很多领域中非常有用,尤其是在教育、媒体制作、内容创作和跨语言交流中。 主要功能: 语音识别(ASR): 自动转录:工具首先会识别视频中的…

20.抽卡只有金,带保底(WPF) C#

这是一个界面应用化后的抽卡&#xff0c;目前只能抽金&#xff0c;只有基础概率加保底概率 适合界面化应用初学者。 这是展示图&#xff1a; 使用的是WPF不是winform&#xff0c;我也是第一次做WPF内容&#xff0c;就可以试一试&#xff0c;代码都在这里了&#xff0c;简单来…

三极管恒流源电路

在电子电路设计中&#xff0c;恒流源是一种非常重要的电路&#xff0c;它可以为负载提供稳定的电流&#xff0c;不受负载阻值变化的影响。 本文将详细解析由两个三极管构成的恒流源电路&#xff0c;探讨其工作原理、设计要点以及应用场景。 一、恒流源电路概述 恒流源电路的…

tx-nocache-copy

tx-nocache-copy 是一种网络适配器&#xff08;NIC&#xff09;功能&#xff0c;主要用于优化数据包的发送过程&#xff0c;特别是在涉及到大数据量传输时。以下是对 tx-nocache-copy 的详细解释&#xff1a; 1. 定义 tx-nocache-copy&#xff1a;指的是在发送&#xff08;tran…

数字孪生的建模师blender和maya你更喜欢用哪个?

在数字孪生技术日益成熟的今天&#xff0c;3D建模软件的选择成为了数字孪生建模师们热议的话题。Blender和Maya作为两大主流的3D建模软件&#xff0c;艾斯视觉在数字孪生领域深耕多年:各自拥有独特的优势和广泛的应用领域。本文将从多个维度对比分析Blender和Maya&#xff0c;探…

leetcode 面试经典 150 题:有效的数独

链接有效的数独题序号36题型数组解题方法双层for循环一次遍历法难度中等熟练度✅✅✅ 题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1…

一个从oracle使用spool导出数据到kadb的脚本

1. dump_data.sh调用sql_dump.sh导出数据 2. load_data.sh将导出的数据加载至KADB 1. dump_data.sh #!/bin/bash begin_time$(date %Y%m%d -d -1 day) end_time$(date %Y%m%d) echo "数据导出日期:"$begin_time echo "数据导出日期:"$begin_time >>…