技术分享 | MySQL EXPLAIN ANALYZE

MySQL 8.4 新特性实战:EXPLAIN ANALYZE 如何让我少加 3 天班 通过 MySQL 8.4 引入的,我们能够更深入地了解查询的真实执行情况,从而避免猜测、减少无效优化和无谓的加班。它为我们提供了一种快速准确的方式来定位性能瓶颈,验证优化效果,甚至在无需重写查询的情况下提升查询性能。对于忙碌的开发人员和运维人员来说,掌握这一工具,确实能够节省大量的加班时间。 阅读详情

作者:Norvald H. Ryeng  译:徐轶韬
本文转载自公众号:MySQL解决方案工程师

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

如何使用?

我们将使用 Sakila 样本数据库中的数据和一个查询举例说明,该查询列出了每个工作人员在 2005 年 8 月累积的总金额。查询非常简单:

mysql>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 将向我们显示查询计划和成本估算:

mysql>EXPLAIN FORMAT=TREE
mysql>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 on <temporary>
-> Aggregate using temporary table
-> Nested loop inner join (cost=1757.30 rows=1787)
-> Table scan on staff (cost=3.20 rows=2)
-> Filter: (payment.payment_date like '2005-08%') (cost=117.43 rows=894)
-> Index lookup on payment using idx_fk_staff_id (staff_id=staff.staff_id) (cost=117.43 rows=8043)

但这并不能表明这些估计是否正确,或者查询计划实际上是在哪些操作上花费的时间。EXPLAIN ANALYZE 将执行以下操作:

mysql>EXPLAIN ANALYZE
mysql>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 on <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 on staff (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 on payment 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.988ms。这意味着大部分时间都花在了使用索引查找来读取行上,并且与读取数据相比,实际的过滤成本相对低廉。实际读取的行数为 2844,而估计为 894 行。优化器错过了 3 倍的因素。同样,由于循环,估计值和实际值都是所有循环迭代的平均值。如果我们查看 schema,发现 payment_date 列上没有索引或直方图,因此提供给优化器的统计信息是有限的。如果使用更好的统计信息可以得出更准确的估计值,我们可以再次查看索引查找迭代器。我们看到该索引提供了更加准确的统计信息:估计 8043 行与 8024 实际读取行。发生这种情况是因为索引附带了额外的统计信息,而这些数据对于非索引列是不存在的。

那么用户可以使用这些信息做什么?需要一定的练习,用户才可以分析查询并理解为什么它们表现不佳。但是,这里有一些帮助入门的简单提示:

  • 如果疑惑为何花费这么长时间,请查看时间。执行时间花在哪里?

  • 如果您想知道为什么优化器选择了该计划,请查看行计数器。如果估计的行数与实际的行数之间存在较大差异(即,几个数量级或更多),需要仔细看一下。优化器根据估算值选择计划,但是查看实际执行情况可能会告诉您,另一个计划会更好。

EXPLAIN ANALYZE 是 MySQL 查询分析工具里面的一个新工具:

  • 检查查询计划:EXPLAIN FORMAT = TREE

  • 分析查询执行:EXPLAIN ANALYZE

  • 了解计划选择:OPTIMIZER TRACE

希望您喜欢这个新功能,EXPLAIN ANALYZE 将帮助您分析和了解缓慢的查询。

MySQL EXPLAIN命令格式详解与性能优化实践 EXPLAIN是MySQL数据库性能调优的核心工具,通过分析SQL执行计划帮助开发者优化查询性能。其原理是展示查询优化器选择的执行路径,包括表扫描方式、索引使用情况和连接算法等关键技术细节。在工程实践中,不同版本的MySQL提供了TRADITIONAL、JSON和TREE三种输出格式,分别适用于快速诊断、深度分析和可视化展示等场景。特别是MySQL 8.0引入的TREE格式和ANALYZE模式,为复杂查询优化提供了更直观的调试手段。合理运用这些工具可以显著提升SQL执行效率,解决索引失效、全表扫描等常见性能 阅读详情

相关推荐

数据库执行计划深度解析:从EXPLAIN到SQL调优实战

执行计划是数据库查询优化的核心工具,它揭示了数据库引擎执行SQL语句的内部逻辑与数据访问路径。理解执行计划的工作原理,能帮助开发者从被动应对慢查询转向主动性能调优。通过分析索引使用、连接顺序、数据扫描方式等关键信息,可以精准定位性能瓶颈,验证索引有效性,并引导优化器选择更高效的执行策略。在MySQL和PostgreSQL等主流数据库中,结合EXPLAIN ANALYZE等高级指令,还能对比预估与实际执行成本,识别统计信息偏差。掌握执行计划解读,是进行SQL性能优化、解决慢查询问题的必备技能,尤其适用于高并发

weixin_30613433的博客 391

MySQL Explain关键字:`EXPLAIN ANALYZE` 的使用

MySQL 8.0.18 引入了`EXPLAIN ANALYZE`, 这是一个用于查询的分析工具,它会运行语句并生成EXPLAIN输出,包含计时器和迭代器的附加信息。

常备不懈 1708

MySQL慢查询诊断四步法:从slow query log到EXPLAIN优化

慢查询是数据库性能问题的核心表征,其本质是SQL执行计划低效与资源消耗失衡的技术现象。理解其原理需把握三个关键层:底层由查询优化器基于统计信息生成执行计划,中层依赖索引结构(B+树)决定数据访问路径,上层受应用层访问模式与配置参数(如long_query_time)共同约束。技术价值在于将模糊的‘变慢’转化为可度量、可追溯、可验证的工程动作——通过mysqld.cnf精准定义慢查询阈值,利用slow query log实现问题捕获,再以EXPLAIN完成执行计划的结构化透视。典型应用场景覆盖高并发Web接口

weixin_30691871的博客 375

Presto 之 explain and explain analyze的实现

本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会真正执行查询,而且打印出来的执行计划是真正运行的执行计划。不仅如此,explain analyze还包含各个stage的时间等,信息比单独的explain丰富。

王飞活的博客 3416

慢查询排查利器:深入解读EXPLAIN执行计划,掌握数据库优化核心

在数据库性能优化领域,理解查询执行原理是每位开发者的必修课。SQL执行计划是数据库优化器根据统计信息生成的查询路径蓝图,它揭示了数据访问方式、连接顺序和资源消耗预估。通过分析执行计划中的关键指标,如访问类型(type)、扫描行数(rows)和额外信息(Extra),可以精准定位性能瓶颈,例如全表扫描(ALL)或低效排序(Using filesort)。这项技术的核心价值在于,它将性能优化从“盲目猜测”变为“有据可依”,能显著提升慢查询排查和系统调优效率。在实际应用场景中,无论是电商系统的多表关联查询,还是日

weixin_34101229的博客 356

高德地图与CAD图叠加显示方法汇总及优缺点分析

高德地图应用在许多领域,平常我们用的地图导航,除过正常的地图导航指引功能之外,其实还有很多实用的功能。如高德影像地图应用在包括地理、土地测量、水文学、生态学、气象学以及海洋学等方面。AutoCAD在行业中常用于城市规划、平面设计、建筑师等,这其中也要用到高德地图。最常见的是CAD图与高德地图叠加使用,通过两者叠加直观显示,助力行业提高工作效率。那如何将高德地图与CAD图叠加显示呢?下面听小编把方法一一介绍下以及各种方法的优缺点。

vjmap的博客 2728

GP-SQL优化之explain analyze

通过explain观察执行计划,从而确定如何优化SQL 查询优化器使用数据库的数据统计信息来选择具有最小总代价的查询计划,查询代价通过磁盘I/O取得的磁盘页面数作为单位来度量。 可以使用EXPLAIN和EXPLAIN ANALYZE语句发现和改进查询计划。 EXPLAIN的语法如下: 1、EXPLAIN [ ANALYZE ] [ VERBOSE ] statement ANALYZE:执行命...

唐僧洗头爱飘柔 6447

模型优化系列——模型剪枝/量化概述

模型优化目的:通过减少模型大小,提高推理速度等使模型成功部署在各个硬件中并实时有效运作。

qq_61210574的博客 1293

【MySQL】explain analyze简介

通过主键索引(聚簇索引)扫描表,仅进行单行扫描,预计消耗0.35ms并返回1行,实际读取第一行平均花费0.084ms,返回所有行平均花费0.084ms,共循环调用该迭代器1次。:进行嵌套表连接,预计消耗0.70ms并返回1行,实际读取第一行平均花费0.085ms,返回所有行平均花费0.085ms,共循环调用该迭代器1次,返回0行。:扫描d1全表,预计消耗0.35ms并返回1行,实际读取第一行平均花费0.084ms,返回所有行平均花费0.084ms,共循环调用该迭代器1次,返回0行。

qq_38396859的博客 3766

VIPER22A实战:从零搭建15W非隔离电源,附BUCK电路调试心得

本文详细介绍了使用VIPER22A芯片从零搭建15W非隔离电源的全流程,重点解析BUCK电路设计与调试技巧。通过核心参数计算、PCB布局优化和效率提升方案,帮助工程师快速掌握DC-DC电源设计要点,实现高效稳定的电源转换。

redis7keeper的博客 671

Qt中常见的面试题总结

基于Qt开发的一些常用面试题

一名热爱编程的程序员 8493

MySQL EXPLAIN ANALYZE

本文转载自“MySQL解决方案工程师”公众号,由徐轶韬翻译作者:Norvald H. Ryeng 译:徐轶韬MySQL8.0.18刚刚发布,它包含一个全新的功能EXPL...

老叶茶馆 7826

Rockchip 自定义vendorstorages数据再u-boot通过cmdline给kernel传递数据

本文介绍通过vendorstorages,允许保存和读取自定义数据。通过在U-Boot中读取这些数据并将其添加到cmdline中,将这些数据传递给Linux内核,实现了一个灵活的方式来配置和定制系统的需求。

我其实什么都不会 1819

mysql analyze_技术分享 | MySQL EXPLAIN ANALYZE

作者:Norvald H. Ryeng 译:徐轶韬本文转载自公众号:MySQL解决方案工程师MySQL 8.0.18 刚刚发布,它包含一个全新的功能 EXPLAIN ANALYZE,用来分析和理解查询如何执行。**EXPLAIN ANALYZE 是什么?**EXPLAIN ANALYZE 是一个用于查询的分析工具,它向用户显示 MySQL 在查询上花费的时间以及原因。它将产生查询计划,并对其进行...

weixin_33936111的博客 725

黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)

erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。erase完成后,将erase的区域都要么是全0,要么是全1。那么到底是0还是1呢,根据不同的工艺有所不同,但是别担心,在ecsd[181]中会有说明到底是1还是0。erase命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

黑猫奥利奥的博客 7797

Claude Code 新手安装指南,手把手教你怎么安装使用

如果你是企业内网用户,或者需要自定义 API 端点,那可以用手动配置 API Key 的方式。

篮球界最会写bug的人;程序猿中打球最菜的人。 492

IoTDB运维实战:我用Explain和Explain Analyze搞定慢查询的踩坑与经验

风电场监控系统因IoTDB查询性能瓶颈导致延迟飙升至47秒。通过分析发现,跨风机查询缺乏合理分区策略。借助IoTDB V1.3.2+的Explain与Explain Analyze工具,精准定位执行计划问题,实现查询优化,验证了软件层面调优对工业时序数据系统的关键作用。

优快云博客专家,领域包括但不限于:AI、大数据、Python、架构师,有合作、课程、问题、疑惑请私信博主 2万+

【Win10/11】Windows电脑WiFi显示小地球/断网的解决方法 Windows WiFi小地球、网络连接中断、网络重置、无线网卡驱动、Win10/Win11网络修复

最近经常有粉丝留言问我,Windows 电脑突然连不上 WiFi,右下角网络图标显示成了“小地球 🌐”,或者干脆提示“未连接 - 没有可用的连接”。明明其他设备网络都正常,唯独自己的电脑断了。作为在互联网大厂混迹多年的前端程序员,我自己也碰到过这个问题。总结几种比较常见、亲测有效的解决方法,写出来供大家参考,希望能帮你快速恢复上网!问题原因推荐解决方法系统设置错乱使用网络重置功能驱动异常或冲突卸载后重启自动安装驱动驱动版本过旧手动更新网卡驱动实在不行考虑使用系统还原点或重装系统这几个方法中,

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3852

MySQL - 查询优化神器:explain 执行计划详解与实战

MySQL EXPLAIN 执行计划优化指南 摘要 EXPLAIN 是 MySQL 性能调优的核心工具,能够透视 SQL 执行过程,揭示潜在性能瓶颈。本文详解 EXPLAIN 各关键字段,包括访问类型(type)、索引使用(key/possible_keys)、扫描行数(rows)和额外信息(Extra),并提供从基础到高级的优化策略。 核心要点: 访问类型(type)从最优到最差排序:system > const > eq_ref > ref > range > index

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

用EXPLAIN扒光SQL底裤:老司机带你玩转MySQL性能分析(实战篇)!!!

曾经有个500万行的表查询要8秒,用EXPLAIN一看——type是index,Extra有Using filesort。把ORDER BY字段加到索引后,0.2秒搞定!这工具用好了,真的是事半功倍!!!(下次面试被问SQL优化,先把EXPLAIN的字段背熟,保证惊艳面试官!

Cyb3rMagnet的博客 1088

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql查询优化-show命令_MySQL SQL 优化命令行&问题 SQL 抓取方式

墨墨导读:优化的道路永无止境。对于数据库来说安装,部署几乎是一次性的。后期的管理和优化是持续性的工作。对于MySQL来说,可以说90%问题都在SQL语句上面。从问题SQL的筛选和优化,在MySQL环境下常用哪些方式。(以下版本是MySQL8.0.23)MySQL优化前置知识基础1. MySQL优化基础传统关系型数据库里面的优化器分为CBO(Cost_Based Potimizer)和RBO(Rul...

weixin_42509914的博客 301

explain 关键字分析(第一次发)

为啥用图片呢?因为怕大家直接复制粘贴,希望大家好记性不如烂笔头!!

第二颗大白菜 694

EXPLAIN详解:5个技巧让你的SQL效率提升10倍

它的一键部署功能特别适合这种需要持续展示的数据库工具项目,不用配置环境就能在线演示各种执行计划的变化。MySQL的EXPLAIN命令是优化SQL查询的利器,但很多开发者只是简单看一眼type字段就结束了。有个实际案例:通过将两个单列索引改为(a,b)联合索引,查询时间从800ms降到50ms。我曾优化过一个分组查询:通过增加内存排序缓冲区大小,避免了磁盘临时表,性能提升8倍。如果扫描行数在1000行以内,且没有更好的索引可用,全表扫描可能比走索引更快。同样的SQL在不同数据量下可能有完全不同的执行计划。

IndigoNight21的博客 752

mysql8.0稳定版本_MySQL 8.0.18 稳定版发布! Hash Join如期而至

MySQL 8.0.18 稳定版(GA)已于昨日正式发布,Hash Join 也如期而至。快速浏览一下这个版本的亮点!1.Hash JoinHash Join 不需要任何索引来执行,并且在大多数情况下比当前的块嵌套循环算法更有效。2.EXPLAIN ANALYZEEXPLAIN ANALYZE 将运行查询,然后生成 EXPLAIN 输出,以及有关优化程序估计如何与实际执行相匹配的其他信息。为 CR...

weixin_35823099的博客 1741

MySQL 8.0 SQL优化黑科技,面试官都不一定知道!

MySQL 8.0带来10大SQL优化黑科技:直方图优化数据倾斜查询、隐形索引实现零风险上线、降序索引优化混合排序、窗口函数提升报表性能10倍+、CTE简化递归查询、EXPLAIN ANALYZE获取真实执行耗时、Hash Join加速大表关联、资源组控制CPU分配、Instant DDL秒级加列、Skip Scan优化复合索引查询。这些特性显著提升优化器智能度、降低维护风险、增强SQL表达能力,使慢SQL优化效率倍增,成为面试加分项。建议升级8.0+版本体验这些性能"黑科技"。

likuoelie的博客 902
上一篇: 1024开源首发 | 金融级分布式事务框架 TXLE
下一篇: 社区回顾 | 10.26 dbaplus 数据架构与优化沙龙 北京站
爱可生开源社区
博客等级 码龄8年 1937粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值