MySQL执行计划(explain)

Mysql Explain执行计划详解 有了慢查询语句后,就要对语句进行分析。一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EPLATNEXPLAIN的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能。 阅读详情

一、分析

数据规模限制查询速度。在查询前能否预先估计究竟要涉及多少行、使用哪些索引、运行时间呢?答案是肯定的,MySQL 提供了 EXPLAIN 语法来进行查询分析,在 sql 语句前加一个“EXPLAIN”即可。比如要分析如下 SQL 语句:

explain select * from table where id = 1 

执行结果如下:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra

二、EXPLAIN列的解释

  1. 【id 列】
    数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id 列为 null 的就表示这是一个结果集,不需要使用它来进行查询。

  2. 【select_type列】常见的有:

  • simple:表示不需要 union 操作或者不包含子查询的简单 select 查询。有连接查询时,外层的查询为 simple,且只有一个。
  • primary:一个需要 union 操作或者含有子查询的 select,位于最外层的单位查询的 select_type 即为 primary。且只有一个。
  • union:union 连接的两个 select 查询,第一个查询是 dervied 派生表,除了第一个表外,第二个以后的表 select_type 都是 union。
  • dependent union:与 union 一样,出现在 union 或 union all 语句中,但是这个查询要受到外部查询的影响。
  • union result:包含 union 的结果集,在 union 和 union all 语句中,因为它不需要参与查询,所以 id 字段为 null。
  • subquery:除了 from 字句中包含的子查询外,其他地方出现的子查询都可能是subquery。
  • dependent subquery:与 dependent union 类似,表示这个 subquery 的查询要受到外部表查询的影响。
  • derived:from 字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套 select。
  1. 【table 列】显示查询的表
  • 如果查询使用了别名,这里显示别名;
  • 如果不涉及对数据表的操作,那么这显示为 null;
  • 如果显示为尖括号括起来的 就表示这个是临时表,后边的 N 就是执行计划中的 id,表示结果来自于这个查询产生;
  • 如果是尖括号括起来的 <union M,N>,与 类似,也是一个临时表,表示这个结果来自于 union 查询的 id 为 M,N 的结果集。
  1. 【type 列】
    这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为:system > const > eq_ref > ref > fulltext > ref_or_null > unique_subquery > index_subquery > range > index_merge > index > ALL,一般来说,得保证查询至少达到 range 级别,最好能达到 ref。除了 all 之外,其他的 type 都可以使用到索引,除了 index_merge 之外,其他的 type 只可以用到一个索引。

说明:不同连接类型的解释(按照效率高低的顺序排序)

  • system:表中只有一行数据或者是空表,且只能用于 myisam 和 memory 表。如果是 Innodb 引擎表,type 列在这个情况通常都是 all 或者 index。这是 const 连接类型的特殊情况。
  • const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或唯一索引)。因为只有一行,这个值实际就是常数,因为 MySQL 先读这个值然后把它当做常数来对待。
  • eq_ref:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为 not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现 eq_ref。
  • ref:不像 eq_ref 那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。
  • fulltext:全文索引检索。全文索引优先级很高,若全文索引和普通索引同时存在,MySQL 不管代价,优先选择使用全文索引。
  • ref_or_null:与 ref 方法类似,只是增加了 null 值的比较。实际用的不多。
  • unique_subquery:用于 where 中的 in 形式子查询,子查询返回唯一值。
  • index_subquery:用于 in 形式子查询使用到了辅助索引或者 in 常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
  • range:索引范围扫描,常见于使用 >、<、is null、between、in、like 等运算符的查询中。
  • index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见 and、or 的条件使用了不同的索引,官方排序这个在 ref_or_null 之后,但实际上由于要读取所个索引,性能可能大部分时间都不如 range。
  • index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。(比 ALL 更好,因为索引一般小于表数据)。
  • all:这个就是全表扫描数据文件,然后再在 server 层进行过滤返回符合要求的记录。比较糟糕,应该尽量避免。
  1. 【possible_keys 列】
    显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从 where 语句中选择一个合适的语句。

  2. 【key 列】
    实际使用的索引。select_type 为 index_merge 时,这里可能出现两个以上的索引,其他的 select_type 这里只会出现一个。如果为 NULL,则没有使用索引。很少的情况下,MySQL 会选择优化不足的索引。这种情况下,可以在 select 语句中使用 use index (indexname) 来强制使用一个索引或者用 ignore index (indexname) 来强制 MySQL 忽略索引。

  3. 【key_len 列】
    用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去;如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。要注意,MySQL 的 ICP 特性使用到的索引不会计入其中。另外,key_len 只计算 where 条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到 key_len 中。在不损失精确性的情况下,长度越短越好。

  4. 【ref 列】
    显示索引的哪一列被使用了。如果是使用的常数等值查询,这里会显示 const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为 func。

  5. 【rows 列】
    MySQL 认为必须检查的用来返回请求数据的行数。这里是执行计划中估算的扫描行数,不是精确值。

  6. 【Extra 列】
    关于 MySQL 如何解析查询的额外信息。这里可以看到的坏的例子是 Using temporary 和 Using filesort,意思 MySQL 根本不能使用索引,结果是检索会很慢。

说明:extra 列返回的描述的意义。这个列可以显示的信息非常多,有几十种,常用的有:

  • Distinct :在 select 部分使用了 distinc 关键字。一旦 MySQL 找到了与行相联合匹配的行,就不再搜索了。
  • no tables used:不带 from 字句的查询或者 From dual 查询
  • Not exists :MySQL 优化了 left join,一旦它找到了匹配 left join 标准的行,就不再搜索了。
  • 使用 not in() 形式子查询或 not exists 运算符的连接查询,这种叫做反连接。即,一般连接查询是先查询内表,再查询外表,反连接就是先查询外表,再查询内表。
  • Range checked for each Record (index map:#):没有找到理想的索引,因此对从前面表中来的每一个行组合,MySQL 检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一。
  • Using filesort :排序时无法使用到索引时,就会出现这个,常见于 order by 和 group by 语句中。看到这个的时候,查询就需要优化了。MySQL 需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。
  • Using index :列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。
  • Using temporary :表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看 status 变量,used_tmp_table,used_tmp_disk_table 才能看出来。看到这个的时候,查询需要优化了。这里,MySQL 需要创建一个临时表来存储结果,这通常发生在对不同的列集进行 order by 上,而不是 group by 上。
  • Where used :使用了 where 从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型 ALL 或 index,这就会发生,或者是查询有问题。
  • using join buffer (block nested loop),using join buffer (batched key accss):5.6.x之后的版本优化关联查询的 BNL,BKA 特性。主要是减少内表的循环数量以及比较顺序地扫描查询。
  • using sort_union,using_union,using intersect,using sort_intersection:
    using intersect:表示使用 and 的各个索引的条件时,该信息表示是从处理结果获取交集
  • using union:表示使用 or 连接各个使用索引的条件时,该信息表示从处理结果获取并集
  • using sort_union 和 using sort_intersection:与前面两个对应的类似,只是他们是出现在用 and 和 or 查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。
  • using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在 server 层进行过滤。查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。extra列显示using index condition
  • firstmatch(tb_name):5.6.x开始引入的优化子查询的新特性之一,常见于where字句含有in()类型的子查询。如果内表的数据量比较大,就可能出现这个
  • loosescan(m…n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个
  1. 【filtered 列】
    使用 explain extended 时会出现这个列,5.7 之后的版本默认就有这个字段,不需要使用 explain extended 了。这个字段表示存储引擎返回的数据在 server 层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

弄明白 explain 语法返回的每一项结果,就能知道 sql 语句大致的运行时间,如果查询里没有用到索引、或者需要扫描的行过多,那么可以感到明显的延迟。因此需要改变查询方式或者新建索引。MySQL 中的 explain 语法可以帮助改写查询,优化表的结构和索引的设置,从而最大地提高查询效率。当然,在大规模数据量时,索引的建立和维护的代价也是很高的,往往需要较长的时间和较大的空间,如果在不同的列组合上建立索引,空间的开销会更大。因此索引最好设置在需要经常查询的字段中。

MYSQL EXPLAIN执行计划详解 mysql查询优化器在基于成本和规则对一条查询语句进行优化后,会生成一条执行计划,这个执行计划展示了接下来执行查询的具体方式,比如多表连接的顺序是什么,采用什么访问方法来具体查询每个表等。设计mysql的大叔贴心地提供explain语句,可以让我们查看某个查询语句的具体执行计划。除了select开头的查询语句,其余的delete,insert,update,replace语句前面都可以加上explain这个词,用来查看这些语句的执行计划。 阅读详情

相关推荐

mysql explain执行计划详解

前言 在日常开发中,经常会碰到mysql性能调优的问题,比如说某个功能一开始使用的时候,响应挺快,但是随着时间的推移,应用的访问量,数据量上去之后,发现越来越慢,甚至更糟糕,通常来说,排除了网络相关的因素之后,大多数情况下都是由sql问题引起的 因此,如何对查询的sql语句进行优化就成了关键所在,但是对不少开发同学来说,sql调优的范围太大,经常会显得无从下手,基于经验是一方面,另一方面需要对一条sql的底层执行原理有着较为深入的理解,这样才不会显得毫无头绪,其中,掌握explain关键字的使用对于mysq

congge 5641

二、mysql——Explain工具介绍和查看mysql运行时间

使用的数据库脚本 DROP TABLE IF EXISTS `actor`; CREATE TABLE `actor` ( `id` int(11) NOT NULL, `name` varchar(45) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `actor` (`id`, `name`, `upda

lovesman的博客 1632

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

mysql 如何查看sql语句执行时间和效率

1 show profiles; 2 查看profiling 是否是on状态; 3 如果是off,则 set profiling = 1; 4 执行自己的sql语句; 5 show profiles;就可以查到sql语句的执行时间;

曲洋的博客 2万+

交通银行金融科技后端开发实习生面试经验

笔试之路的第一个脚印。不足的地方:基本功不扎实,得补。先补sql(先整理出一篇sql语句做题的文章,争取下次笔试拿下这一块),编程题中的SQL写不出来感觉很丢人。然后补八股文,结合一些网上项目教程,来理解常用的一些八股文(比如各种锁)。

T__TSZ的博客 1719

[FreeRTOS+STM32CubeMX] 03 USART串口调试-基于中断实现接收和发送数据

我们接着上一小节,上一节讲到,接收上位机传来的数据时,需要事先知道传来的数据的字节数,这一操作实在有些反人类,那么如何解决这个问题,上位机输入多少,我们就接收多少数据呢? 接下来我将把USART引入中断,在接收数据的回调函数中引入二值信号量、消息队列,来让我的接收数据能够存储在队列中,并一个一个的在任务中输出出来,并最终在上位机回显。

RichieHuang的博客 2648

mysql中explain使用说明

mysql中确定sql是否需要优化的方式很多,常见的就是看sql的执行时间,一般的sql执行的正常查询时间是在毫秒级,几十毫秒或是几百毫秒(数据在千万级别的除外,暂时没有处理过此处不做讨论),执行时间超过此时间段的就需要进行优化了。这也是本文的重点说明的内容,将具体讲述执行计划中每个字段的含义。Using index condition && using where:使用索引查询,sql语句的where子句查询条件字段存在非同一索引字段,且开启索引下推功能,需要回表查询即可拿到结果。...

weixin_43401380的博客 3621

YOLOv8模型INT8量化实战:解决sigmoid输出归零的坑(附代码修改)

本文详细介绍了YOLOv8模型INT8量化过程中遇到的sigmoid输出归零问题及其解决方案。通过修改模型导出代码、优化ONNX量化流程,并提供完整的部署优化技巧,帮助开发者在边缘计算设备上实现高效的模型推理。文章还包含量化效果验证和常见问题排查方法,助力开发者快速解决实际部署中的难题。

vvv99的博客 252

高性能Mysql——SQL执行计划分析(EXPLAIN)

文章目录通过EXPLAIN进行执行计划分析IDselect_typeTablePartitionsTypeExtrapossible_keysKeykey_lenRefRowsFilteredEXPLAIN不能完成的事项 通过EXPLAIN进行执行计划分析 在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个...

No_Game_No_Life_的博客 1665

安卓应用锁开发实战:如何通过拦截Activity启动实现密码验证(附完整代码)

本文深入探讨了在安卓系统中开发应用锁功能的两种实战方案:通过修改ActivityStarter源码或实现IActivityController接口来拦截Activity启动流程,从而实现启动前的密码验证。文章详细对比了两种方案的技术选型、实现细节与适用场景,并提供了处理隐式Intent、验证状态管理等核心问题的完整代码,为开发系统级安全功能提供了实用指南。

tcp8optimizer的博客 455

四旋翼滑模控制:从理论到Simulink实现

本文深入探讨了四旋翼滑模控制的理论与Simulink实现,对比了其相较于PID控制在抗干扰和鲁棒性方面的显著优势。文章详细介绍了从精确动力学建模、内外环滑模控制器设计到指令解算的完整流程,并分享了Simulink仿真搭建、参数调试及抗扰性能验证的实战经验,帮助工程师掌握在复杂环境下提升四旋翼稳定性的进阶技能。

weixin_29163581的博客 375

一文带你了解SQL的执行计划(explain)

为什么关注sql的执行计划,因为一个sql的执行计划可以告诉我们很多关于如何优化sql的信息。通过一个sql计划,如何访问中的数据 (是使用全表扫描还是索引查找?)一个表中可能存在多个表中不同的索引,表中的类型是什么是否子查询、关联查询等…sql学习来自于sqlercn讲师了解SQL如何访问表中的数据了解SQL如何使用表中的索引了解SQL所使用的查询类型。...

黎明强的博客 2万+

odom反算成经纬度

这个转换系统能够将局部坐标(相对于原点的X, Y, Z坐标)转换回全球坐标系统。将局部里程计数据反算成经纬度坐标的过程涉及几个关键步骤,主要是将相对于某个局部参考点的坐标(例如在机器人、无人车或无人机的导航系统中使用的坐标)转换回全球GPS坐标系统(WGS-84经纬度)。为了能够将局部里程计数据转换为经纬度,首先需要知道局部坐标系统的原点(即参考点)在全球坐标系统中的位置。对于从里程计获得的每个局部坐标点,使用步骤2中设置的坐标转换系统将其转换为经纬度。使用转换模型将局部坐标转换为全球坐标。

如果想成为中心,那么就到中心去吧。 650

MySQL Explain 分析 SQL 执行计划

通过熟练使用 EXPLAIN 工具,你可以更直观地了解 MySQL 查询的执行细节,并针对性地进行优化,为数据库性能提升提供有力支持。借助这些信息,开发者能够针对性地优化查询和索引设计,从而提升查询性能。对于包含子查询、JOIN 或 UNION 的复杂查询,可以分别查看各个子查询的执行计划,识别每个部分的瓶颈并逐步优化。EXPLAIN 是 MySQL 内置的分析工具,用于展示查询语句的执行计划。在优化 SQL 查询性能时,了解查询的执行计划至关重要。只需在查询语句前加上 EXPLAIN 即可。

QQ828929QQ的博客 3938

Windows密码忘了怎么办?一分钟看懂Windows密码底层机制:无需重装系统也能无痕找回登录密码

忘记Windows开机密码,不一定非得重装系统!本文手把手教你通过提取NTLM Hash值实现“无痕找回密码”,无需PE、无需清除密码,对系统零修改 🛡️ 搭配mimikatz与在线解密平台,小白也能快速上手,了解Windows密码底层机制 🔐

XiaoqiangClub的博客 119

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一文读懂 MySQL Explain 执行计划

一、前言 上周老周的一个好朋友让我出一篇教你读懂 SQL 执行计划,和我另一位读者反馈的面试题如何排查慢 SQL 的强相关,索性先出一篇一文读懂 MySQL Explain 执行计划。Explain 执行计划你一定得会看,不然你简历上就别去写什么你会 SQL 调优,不然面试官会觉得,Explain 执行计划你都不会看,那你还 SQL 调啥优啊?SQL 调你吧???开个小玩笑,玩笑归玩笑,重要是真的重要!!! 二、Explain 执行计划是什么? 什么是执行计划?简而言之,就是 SQL 在数据库中执行时的表现

riemann_的博客 4595

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL—— MySQL的执行计划详解(Explain)

文章目录1、MySQL执行计划的定义2、MySQL整个查询的过程3、如何启动执行计划4、Explain分析示例4、explain的 两个变种(我的版本是5.7)5、explain中的列5.1、id5.2、select_type5.3、table5.4、type5.5、possible_keys5.6、key5.7、key_len5.8、ref5.9、rows5.10、fitered5.11、Extra 1、MySQL执行计划的定义 在 MySQL 中可以通过 explain 关键字模拟优化器执行 SQL语

zhouhengzhe的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL-执行计划、explain关键字查询执行计划以及explain案例分析

MySQL 的执行计划(Execution Plan)是数据库查询优化器生成的一种指导性信息,它描述了 MySQL 执行查询时所采用的具体执行策略。执行计划通常由 MySQL 的查询优化器根据查询语句、表结构、索引等信息进行生成,并且用于指导 MySQL 数据库引擎执行查询操作。

小孔靠得住的博客 2913

【MySQL进阶】EXPLAIN执行计划

数据库性能优化是一个涉及多个层面的综合性工作,涵盖配置、调优和性能评估等多个环节。优化单个SQL查询。优化整个应用程序的数据库访问模式。优化单个数据库服务器的配置与资源使用。优化多个联网数据库服务器(如集群、读写分离)的协作与数据分布。影响性能的关键层级数据库软件层面的因素(如表结构设计、查询语句效率、数据库配置参数)是性能的基础,它们最终会转化为硬件层面的CPU计算和I/O操作。深入理解数据库软件本身(如SQL语法、索引机制、配置项)的优化规则是首要任务。

2301_80224556的博客 1410

MySQL EXPLAIN执行计划详解

详细介绍了MySQL EXPLAIN执行计划的各个字段的含义以及使用方式。

终生学习践行者 2577

一文带你了解MySQL之Explain执行计划

一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的`执行计划`,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等

Multis 1546

一文读懂MySQL执行计划 Explain

Explain 执行计划 MySQL执行计划 SQL优化 性能优化

liuxuquan 2763

mysql的Explain执行计划用法

通过上面的例子理解:创建了(name,deptid)的复合索引,查询的时候也使用复合索引或部分,这就形成了覆盖索引。简记:查询使用复合索引,并且查询的列就是索引列,不能多,个数需对应。range:只检索给定范围的行,使用一个索引来检索行,可以在key列中查看使用的索引,一般出现在where语句的条件中,如使用between、>、

wokoone的博客 1003

MySQL EXPLAIN 执行计划全解析

MySQL的EXPLAIN命令是SQL优化和性能分析的核心工具,通过解析其输出的12个关键字段(包括id、select_type、type、key等)可以深入了解查询执行计划。其中type列(访问类型)尤为重要,按性能排序为system>const>eq_ref>ref>range>index>ALL,全表扫描(ALL)必须优化。其他关键指标如key(实际使用索引)、rows(预估扫描行数)和Extra(额外信息)也直接影响查询效率。通过全面分析这些字段,可以精准定

2301_79718352的博客 1848
上一篇: 用缓存的原因:高性能和高并发
下一篇: 数据 结构
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值