本文转载自“MySQL解决方案工程师”公众号,由 徐轶韬翻译

作者:Norvald H. Ryeng  译:徐轶韬
MySQL8.0.18刚刚发布,它包含一个全新的功能EXPLAIN ANALYZE,用来分析和理解查询如何执行。
EXPLAIN ANALYZE是什么?
EXPLAIN ANALYZE是一个用于查询的分析工具,它向用户显示MySQL在查询上花费的时间以及原因。它将产生查询计划,并对其进行检测和执行,同时计算行数并度量执行计划中不同点上花费的时间。执行完成后,EXPLAIN ANALYZE将输出计划和度量结果,而不是查询结果。
这项新功能建立在常规的EXPLAIN基础之上,可以看作是MySQL 8.0之前添加的EXPLAIN FORMAT = TREE的扩展。EXPLAIN除了输出查询计划和估计成本之外,EXPLAIN ANALYZE还会输出执行计划中各个迭代器的实际成本。

如何使用?

我们将使用Sakila样本数据库中的数据和一个查询举例说明,该查询列出了每个工作人员在2005年8月累积的总金额。查询非常简单:
SELECT first_name, last_name, SUM(amount) AS total
FROM staff INNER JOIN payment   ON staff.staff_id = payment.staff_id   AND payment_date LIKE '2005-08%'
GROUP BY first_name, last_name;
+——————+—————+—————+
| first_name | last_name | total    |
+——————+—————+—————+
| Mike       | Hillyer   | 11853.65 |
| Jon        | Stephens  | 12218.48 |
+——————+—————+—————+
2 rows in set (0,02 sec)
只有两个人,Mike和Jon,我们在2005年8月获得了他们的总数。
EXPLAIN FORMAT = TREE将向我们显示查询计划和成本估算:
EXPLAIN FORMAT=TREE
SELECT first_name, last_name, SUM(amount) AS total
FROM staff INNER JOIN payment   ON staff.staff_id = payment.staff_id   AND payment_date LIKE '2005-08%'
GROUP BY first_name, last_name;
-> Table scan ><temporary>  -> Aggregate using temporary table   -> Nested loop inner join  (cost=1757.30 rows=1787)    -> Table scan >(cost=3.20 rows=2)   -> Filter: (payment.payment_date like '2005-08%')  (cost=117.43 rows=894)    -> Index lookup >using idx_fk_staff_id (staff_id=staff.staff_id)  (cost=117.43 rows=8043)
但这并不能表明这些估计是否正确,或者查询计划实际上是在哪些操作上花费的时间。EXPLAIN ANALYZE将执行以下操作:
EXPLAIN ANALYZE
SELECT first_name, last_name, SUM(amount) AS total
FROM staff INNER JOIN payment   ON staff.staff_id = payment.staff_id   AND payment_date LIKE '2005-08%'
GROUP BY first_name, last_name;
-> Table scan ><temporary>  (actual time=0.001..0.001 rows=2 loops=1)    -> Aggregate using temporary table  (actual time=58.104..58.104 rows=2 loops=1)   -> Nested loop inner join  (cost=1757.30 rows=1787) (actual time=0.816..46.135 rows=5687 loops=1)   -> Table scan >(cost=3.20 rows=2) (actual time=0.047..0.051 rows=2 loops=1)  -> Filter: (payment.payment_date like '2005-08%')  (cost=117.43 rows=894) (actual time=0.464..22.767 rows=2844 loops=2)   -> Index lookup >using idx_fk_staff_id (staff_id=staff.staff_id)  (cost=117.43 rows=8043) (actual time=0.450..19.988 rows=8024 loops=2
这里有几个新的度量:
  • 获取第一行的实际时间(以毫秒为单位)
  • 获取所有行的实际时间(以毫秒为单位)
  • 实际读取的行数
  • 实际循环数

让我们看一个具体的示例,使用过滤条件的迭代器成本估算和实际度量,该迭代器过滤2005年8月的数据(上面EXPLAIN ANALYZE输出中的第13行)。

Filter: (payment.payment_date like '2005-08%')
(cost=117.43 rows=894)
(actual time=0.464..22.767 rows=2844 loops=2)
我们的过滤器的估计成本为117.43,并且估计返回894行。这些估计是由查询优化器根据可用统计信息在执行查询之前进行的。该信息也会在EXPLAIN FORMAT = TREE输出中。
我们将从最后面的循环数开始。此过滤迭代器的循环数为2。这是什么意思?要了解此数字,我们必须查看查询计划中过滤迭代器上方的内容。在第11行上,有一个嵌套循环联接,在第12行上,是在staff表上进行表扫描。这意味着我们正在执行嵌套循环连接,在其中扫描staff表,然后针对该表中的每一行,使用索引查找和过滤的付款日期来查找payment表中的相应条目。由于staff表中有两行(Mike和Jon),因此我们在第14行的索引查找上获得了两个循环迭代。
对于许多人来说,EXPLAIN ANALYZE提供的最有趣的新信息是实际时间“ 0.464..22.767”,这意味着平均花费0.464毫秒读取第一行,而花费22.767毫秒读取所有行。平均时间?是的,由于存在循环,我们必须对该迭代器进行两次计时,并且报告的数字是所有循环迭代的平均值。这意味着过滤的实际执行时间是这些数字的两倍。如果我们看一下在嵌套循环迭代器(第11行)中上一级接收所有行的时间,为46.135毫秒,这是运行一次过滤迭代器的时间的两倍多。
这个时间反映了整个子树在执行过滤操作时的根部时间,即,使用索引查找迭代器读取行,然后评估付款日期为2005年8月的时间。如果我们查看索引循环迭代器(第14行),我们看到相应的数字分别为0.450和19.988 ms。这意味着大部分时间都花在了使用索引查找来读取行上,并且与读取数据相比,实际的过滤成本相对低廉。
实际读取的行数为2844,而估计为894行。优化器错过了3倍的因素。同样,由于循环,估计值和实际值都是所有循环迭代的平均值。如果我们查看schema,发现payment_date列上没有索引或直方图,因此提供给优化器的统计信息是有限的。如果使用更好的统计信息可以得出更准确的估计值,我们可以再次查看索引查找迭代器。我们看到该索引提供了更加准确的统计信息:估计8043行与8024实际读取行。发生这种情况是因为索引附带了额外的统计信息,而这些数据对于非索引列是不存在的。
那么用户可以使用这些信息做什么?需要一定的练习,用户才可以分析查询并理解为什么它们表现不佳。但是,这里有一些帮助入门的简单提示:
  • 如果疑惑为何花费这么长时间,请查看时间。执行时间花在哪里?
  • 如果您想知道为什么优化器选择了该计划,请查看行计数器。如果估计的行数与实际的行数之间存在较大差异(即,几个数量级或更多),需要仔细看一下。优化器根据估算值选择计划,但是查看实际执行情况可能会告诉您,另一个计划会更好。
EXPLAIN ANALYZE是MySQL查询分析工具里面的一个新工具:
  • 检查查询计划: EXPLAIN FORMAT = TREE
  • 分析查询执行: EXPLAIN ANALYZE
  • 了解计划选择: Optimizer trace
希望您喜欢这个新功能,EXPLAIN ANALYZE将帮助您分析和了解缓慢的查询。

扫码加入MySQL技术Q群

MySQL EXPLAIN ANALYZE相关推荐

  1. 根据条件查询某条记录的条数_「性能与架构」MySQL 8 查询优化新工具 Explain Analyze...

    来源:性能与架构公众号 1. Explain Analyze 介绍 Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索. 但他仅仅是评估,不是实际的执行情况 ...

  2. MySQL的explain analyze增强功能

    我们排查关系型数据库的SQL性能问题时,执行计划是重要的手段之一,看执行计划有很多种方法,Oracle可以参考<查询执行计划的几种方法>.<获取执行计划的方法对比>,MySQL ...

  3. 对mysql explain讲的比较清楚的

    对mysql explain讲的比较清楚的 explain结果的每行记录显示了每个表的相关信息,每行记录都包含以下几个字段: id 本次 select 的标识符.在查询中每个 select都有一个顺序 ...

  4. mysql explain insert_简述Mysql Explain 命令

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息帮 ...

  5. 简单了解SQL性能优化工具MySql Explain

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 写在前面 MySql Explain是对SQL进行性能优化不可或缺的工具,通过他我们可以对SQL进行一定的分析和性能优化,降 ...

  6. Mysql Explain 详解

    Mysql Explain 详解 一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二. ...

  7. [转]MySQL Explain详解

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  8. mysql extended_explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二...

    MySQL 的explain命令有一个extended选项,我想可以很多人都没有注意,因为它对命令的输出结果没有任何改变,只是增加了一个warning.这个 warning中显示了MySQL对SQL的 ...

  9. MySQL - Explain深度剖析

    文章目录 生猛干货 官方文档 Explain介绍 测试数据 explain 使用 explain重要列说明 id select_type simple primary subquery derived ...

最新文章

  1. 禁用计算机系统错误汇报,技术员给你关于win10关闭自动发送错误报告的具体方法...
  2. Linux执行mount挂载覆盖文件的还原
  3. php大商创 安装,大商创X2020最新纯净服务器安装教程
  4. python中list与array互相转换
  5. TinyMCE 5 正式版发布,重磅更新!!!
  6. 有功功率 无功功率 功率因数
  7. dnspod ddns 下载_简约时尚休闲女装毛衣针织衫春装详情页_psd素材免费下载_ 750*13450像素(编号:24815329)...
  8. 因为项目的原因,要学习J2EE了
  9. excel怎么设置自动计算_Excel工作进度表,自动甘特进度图,函数计算简单实用...
  10. 如何修改Maven本地仓库位置
  11. Python百钱百鸡问题
  12. 电磁波,无线电,Wifi 4G,摩擦生电
  13. CSS(七)元素过渡、变化、动画
  14. IPsec-Tools配置之racoon
  15. div点击穿透,CSS属性pointer-events :none;实现护眼模式, 夜间模式遮罩
  16. 微信无法定位 请打开定位服务器,微信定位是灰色的点不开是怎么回事?该怎么解决问题呢?...
  17. 四、Testbench
  18. 【Java】继承、多态、接口
  19. 入门PCB设计-DY工作室
  20. 计算机没有外审的核心期刊,国内核心期刊投稿经验总结战友们共同分享丁香园论坛...

热门文章

  1. ng-后台管理之其他文档
  2. Android 4.1 (Jelly Bean) 源码编译过程总结
  3. github python抢票_实测两款 GitHub 开源抢票插件,所有坑都帮你踩过了
  4. 计算机专业课ds是什么,ds学长科普贴之扯谈计算机
  5. 截止8月10日!2022年芜湖市核心技术攻关项目“揭榜挂帅”榜单申报奖补流程
  6. 《数字孪生电网白皮书》发布 UINO打造电力行业数字化转型新引擎
  7. 揭秘 | 一分钟看懂半导体FOWLP封装技术全过程!
  8. 静态环形队列(C语言)
  9. Qt Qwdget 汽车仪表知识点拆解6 自定义控件
  10. 前端面试题:不积跬步无以至千里;不积小流无以成江海;程序人生的精彩需要坚持不懈、脚踏实地的积累。