【MySQL】Explain执行计划(十七)

news2024/11/15 6:58:37

🚗MySQL学习·十七站~
🚩本文已收录至专栏:MySQL通关路
❤️每章节附章节思维导图,文末附全文思维导图,感谢各位点赞收藏支持~
⭐学习汇总贴,超详细思维导图:【MySQL】学习汇总(完整思维导图)

一.引入

当我们需要对SQL语句进行优化时必须先分析其性能时,EXPLAIN是一个不可或缺的神器,它可以帮助我们获取 MySQL 如何执行 SELECT 语句的信息,例如

  • 表如何连接和连接的顺序
  • 哪些索引可以使用
  • 是否使用了索引
  • 实际使用了哪些索引
  • 扫描的数据行数

通过使用Explain执行计划可以说一条SQL语句的“身体状况”完全展现在我们眼前了,借此便可以着手分析它的"健康状况",并为它开出“诊断方案”,最后"实施救治"。

Explain执行计划的使用非常简单,只需要在执行的SQL语句前面加上Explain即可,例如:

Explain 待执行的SQL语句

例如执行如下SQL:

explain select * from user where id = 1668983497699696641;

可以看到如下结果:

在这里插入图片描述

这就是SQL语句的“身体状况”说明书概述:

字段含义
idSelect查询的序列号,表示查询中执行select子句或者是操作表的顺序 (id相同,执行顺序从上到下;id不同,值越大,越先执行)
select_type表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接 或者子查询)、PRIMARY(主查询,即外层的查询)、 UNION(UNION 中的第二个或者后面的查询语句)、 SUBQUERY(SELECT / WHERE之后包含了子查询)等
table使用的是哪张表
partitions分区表命中的分区情况
type数据扫描类型,性能由好到差的连接类型为NULL、system、const、 eq_ref、ref、range、 index、all
possible_key在这张表上可能会使用到的索引,一个或多个
key实际使用的索引,如果为NULL,则没有使用索引
key_len表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好
ref表查找值所用到的字段名或常量
rows预计需要扫描的行数,在innodb引擎的表中,是一个估计值, 可能并不总是准确的
filtered表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好
extra执行过程中一些特殊情况补充说明信息

接下来我们就来一起详细解读一下这张说明书,学习一下如何分析它的症状,其中需要重点关注的是typeextra 列,至于如何“救治”那当然是交给你啦~

二.id

表示Select查询的序列号,表示查询中执行Select子句或者是操作表的顺序

id相同,执行顺序从上到下;id不同,值越大,越先执行

例如,我们执行带子查询的SQL,子查询语句id往往是较大的,表示其先执行。

在这里插入图片描述

三.select_type

表示Select的类型,常见的取值有:

  • SIMPLE:简单表,即不使用表连接 或者 子查询
  • PRIMARY:主查询,即当查询中包含子查询时,最外层的查询被标记为 PRIMARY
  • UNIONUNION 中的第二个或者后面的查询语句
  • SUBQUERYSELECT / WHERE之后包含了子查询

例如,下面SQL语句中,外层查询为PRIMARY主查询,WHERE之后所包含的查询为SUBQUERY子查询。

在这里插入图片描述

四.table

表示使用的是哪张表

例如,外层查询使用了post表,子查询使用了user表。

在这里插入图片描述

五.partitions

表示分区表命中的分区情况,如果表没有进行分区,或者查询没有命中任何分区(例如全表扫描),则该列的值通常为 NULL

补充

当数据表中的数据量很大时,为了提高操作的效率,可能会对表进行分区操作。
所谓的分区就是将一个表分解成多个区块进行操作和保存,从而降低每次操作的数据,提高性能,而对应用来说是透明的,从逻辑上看就只是一个表(这里跟分库分表的访问不一样),但是物理上的这个表可能是由多个物理分区组成,每个分区都是一个独立的对象,可以进行独立处理。

六.type(重要)

表示数据扫描类型通常用来衡量SQL的执行效率,性能由好到差的连接类型为:

  • null:一般不太可能优化到NULL,除非在查询的时候不访问任何表,比如Select ‘A’

  • system:一般出现在访问系统表时

  • const(结果只有一条的主键或唯一索引扫描):表示该表最多有一个匹配记录,一般出现在使用主键或者唯一索引访问时

  • eq_ref(唯一索引扫描):通常出现在联表的情况下,表示主键索引或唯一索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录

  • ref(非唯一索引扫描):一般出现在使用非唯一性索引访问时,可能会匹配到多个记录

  • range(索引范围扫描):一般出现在对索引字段进行范围匹配,比如使用 < 、>、in、between 等关键词

  • index(全索引扫描):只遍历索引树,且只从索引树中获取数据

  • all(全表扫描):表示该查询将遍历全表以找到匹配行,这是最糟糕的一种查询方式

range开始,索引的作用会越来越明显,因此我们需要尽量让 SQL 查询可以使用到 range 这一级别及以上的 type 访问方式。例如,将用作查询条件的字段设置为索引、思考能否设置为唯一索引…

例如,针对下述post表的userId创建了非唯一索引,因此在查询post表时选择了ref非唯一索引扫描,而user的id字段为主键,选择了const级别扫描。

在这里插入图片描述

七.possible_key

表示在这张表上可能会使用到的索引,一个或多个,不代表一定会使用到。

例如,查询涉及到的字段存在联合索引和其他类型索引,优化器将根据所执行的SQL语句选择一个合适的进行使用。

八.key

表示实际使用的索引,如果为NULL,则没有使用索引。

通常,我们在查询条件中使用到了索引字段,该列都会显示所使用到的索引名称。如果使用了索引字段,但是此处显示为NULL,排除mysql估计使用索引比全表扫描更慢的情况,就要仔细想一下索引使用的是不是有问题,例如命中了索引失效的常见几种情况:联合索引非最左匹配、对索引使用函数、左或左右模糊匹配…

九.key_len

表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越索引效果好。

通常情况下,**我们可以根据key_len来判断联合索引是否完全生效。**例如,key显示使用到了联合索引,但是key_len显示的字节数与联合索引实际字节数不符合时,说明只使用到了部分索引。

十.ref

表示表查找值所用到的字段名或常量。通常值为:const(常量),func,NULL,字段名(post.userId)

例如,下述1和2都为const表示用到的为常量(1668904042690179073)。

在这里插入图片描述

十一.rows

表示预计需要扫描的行数。,在innodb引擎的表中,是一个估计值, 可能并不总是准确的。通常,较小的 rows 值通常表示查询效率较高,因为这代表需要处理的数据量较少。

例如,对于一个简单的根据主键进行查询的操作,rows 值通常会很小,可能为 1 ,因为通过主键可以直接定位到唯一的一行数据。

相反,如果一个查询没有使用合适的索引或者索引无法有效地过滤数据,rows 值可能会很大。

比如,一个没有合适索引的全表扫描查询,rows 值可能等于表中的总行数。

十二.filtered

表示**返回结果的行数占需读取行数的百分比, filtered 的值越大越好。**它表示在根据索引条件进行初步筛选后,还需要对结果集进行进一步筛选以得到最终结果的比例。

  • 较高的 filtered 值(接近 100%)通常表示通过索引条件已经能够很好地筛选出接近最终结果的行,这可能意味着查询的效率相对较高。
  • 较低的 filtered 值(例如 10% 或更低)则可能表示在初步筛选后,还需要对大量的行进行进一步的筛选,这可能会影响查询的性能。

十三.extra

表示执行过程中一些特殊情况补充说明信息,例如:

  • Using filesort :当查询语句中包含 order by 操作,而且无法利用索引完成排序操作的时候, 这时不得不选择相应的排序算法进行,甚至可能会通过文件排序,效率是很低的,所以要避免这种问题的出现。

  • Using temporary:使了用临时表保存中间结果,MySQL 在对查询结果排序时使用临时表,常见于排序 order by 和分组查询 group by。效率低,要避免这种问题的出现。

  • Using index:所需数据只需在索引即可全部获得,不须要再到表中取数据,也就是使用了覆盖索引,避免了回表操作,效率不错。

  • Using where:表示 MySQL 在存储引擎检索行后,需要应用 WHERE 子句来过滤结果。

  • Backward index scan:表示 MySQL 正在以相反的方向,即从后往前扫描索引,在大多数情况下,正向的索引扫描通常更有效率,出现反向索引可能扫描影响了查询性能。

十四.全文概览

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[python]面向对象示例:学生管理系统

python面向对象 python基础知识整理 主要界面 建议跟着框架自行完成功能需求,最下面有完整带注释版本,学生信息会存到当前目录下data.txt文本中,没有则会自行创建 涉及到的知识点 面向对象列表, 字典for, if, input…文件操作 需求分析 开始 -> 循环调用主程序 ->不…

盲盒小程序开发,探索市场发展优势

随着潮玩市场的火热&#xff0c;盲盒已经成为了一种集娱乐、社交、消费为一体的模式&#xff0c;越来越多的消费者被盲盒所吸引&#xff0c;盲盒市场也迎来了巨大的发展空间&#xff0c;带来了各种商业机遇&#xff0c;同时为创业者提供新的创业渠道。本文将探讨盲盒小程序的开…

deepin-wine8-stable为某个windows应用设置环境变量

1 环境说明 deepin v23wine 8.16 2 操作步骤 2.1 在终端指定应用打开注册表编辑 WINEPREFIX~/.deepinwine/com.allroundautomations/ deepin-wine8-stable regeditWINEPREFIX:windows应用在wine容器中的路径&#xff0c;一般为~/.deepinwine/你的应用名称包regedit:注册表编…

类型组TYPE-POOL

文章目录 创建类型组使用类型组运行结果 创建类型组 使用类型组 *&---------------------------------------------------------------------* *& Report Z_TEST_TYPEPOOL *&---------------------------------------------------------------------* *& *&…

ClimODE——使用神经网络ODE 进行天气预报

概述 论文地址&#xff1a;https://arxiv.org/abs/2404.10024 源码地址&#xff1a;https://github.com/Aalto-QuML/ClimODE.git 这项研究提出了用于天气预报的神经 ODE 系统 ClimODE&#xff0c;该系统的设计特点是通过局部卷积运算获取局部依赖关系&#xff0c;通过全局关注…

Pycharm虚拟环境中使用pip命令报错ModuleNotFoundError解决办法

Pycharm虚拟环境中输入pip 相关命令时报错ModuleNotFoundError,记录一下。 软件版本&#xff1a; windows:win11 Python:3.11.4 PyCharm:转业版 2024.1.3 报错如下&#xff1a; 在虚拟环境中输入pip 相关命令时报错"ModuleNotFoundError: No module named pip._internal…

基于yolov8的绝缘子缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的绝缘子缺陷检测系统是一种利用先进深度学习技术的高效解决方案&#xff0c;旨在提升电力行业中输电线路的维护和监控水平。YOLOv8作为YOLO系列算法的最新版本&#xff0c;具备更高的检测速度和精度&#xff0c;特别适用于实时物体检测任务。 该系统…

【Spring Boot-IDEA创建spring boot项目方法】

1. 使用Spring Initializr 的 Web页面创建项目 2. 使用 IDEA 直接创建项目&#xff0c;其中有两种不同的搭建路径 3. 使用 IDEA 创建Maven项目并改造为springBoot 最常使用的两种方法其实就是一种&#xff0c;这里介绍在ieda中如何搭建 SpringBoot项目。 1.new Project--> 2…

kafka快速上手

一、kafka介绍 Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。 kafka官网&#xff1a;http://kafka.apach e.org/ 二、kafka入门 生产者发送消息&#xff0c;多个消费者只能有一个消费者接收到消息生产者发送消息&#xff0c;多个消费者都可以接收到消息 …

HarmonyOS开发实战( Beta5版)多线程能力场景化示例最佳实践

在介绍Worker和TaskPool的详细使用方法前&#xff0c;我们先简单介绍并发模型的相关概念&#xff0c;以便于大家的理解。 并发模型概述 并发的意思是多个任务同时执行。并发模型分为两大类&#xff1a;基于内存共享的并发模型和基于消息传递的并发模型。 在基于内存共享的并…

手撕Python之序列类型

1.列表---list 索引的使用 当我们有一个数据的时候&#xff0c;我们怎么将这个数据存储到程序呢&#xff1f; 我们定义一个变量&#xff0c;将数据存储在变量中 那么如果有100个数据呢&#xff1f;要定义100个变量吗&#xff1f; 我们是可以用列表这个东西进行多个数据的存…

单元测试 Mock不Mock?

文章目录 前言单元测试没必要?Mock不Mock?什么是Mock?Mock的意义何在? 如何Mock&#xff1f;应该Mock什么&#xff1f;Mock 编写示例 总结 前言 前段时间&#xff0c;我们团队就单元测试是否采用 Mock 进行了一番交流&#xff0c;各有各的说法。本文就单元测试 Mock不Mock…

11 Java 方法引用、异常处理、Java接口之函数式编程(接口知识补充Function<T,R>、BiFunction<T, U, R>和自定义泛型接口)

文章目录 前言一、Java接口之函数式编程 --- 接口知识补充1 Function<T,R>泛型接口2 BiFunction<T, U, R>泛型接口3 自定义泛型函数式编程接口4 使用lambda表达式、方法引用进行函数式编程 二、方法引用1 方法引用初体验&#xff08;以Array.sort()方法为例&#x…

当了中层才发现:领导根本不在意,你干了多少活

在职场的棋盘上&#xff0c;每个人都是一枚棋子&#xff0c;而中层领导则像是那些走在前线的骑士——既要冲锋陷阵&#xff0c;又要运筹帷幄。但你有没有想过&#xff0c;领导真的在意你加班到深夜&#xff0c;或是周末还在回复邮件吗&#xff1f; 当你从基层一步步爬到中层&a…

Unity(2022.3.41LTS) - UI详细介绍-Slider(滑动条)

目录 零.简介 一、基本功能与用途 二、组件介绍 零.简介 在 Unity 中&#xff0c;Slider&#xff08;滑动条&#xff09;是一个可以滑动的 UI 组件. 一、基本功能与用途 数值调节&#xff1a;主要功能是让用户在一个特定的数值范围内进行选择。例如&#xff0c;可以用于调…

深度学习之张量(Tensor)的创建、常见属性及数据转换

基本概念 PyTorch会将数据封装成张量&#xff08;Tensor&#xff09;进行计算&#xff0c;所谓张量就是元素为相同类型的多维矩阵。 张量是一个多维数组&#xff0c;通俗来说可以看作是扩展了标量、向量、矩阵的更高维度的数组。张量的维度决定了它的形状&#xff08;Shape&a…

同城搭子系统小程序开发产品分析

1. 市场调研与需求分析 目标用户定位&#xff1a;定义核心用户群&#xff0c;例如上班族、学生、旅游爱好者等。需求收集&#xff1a;运用问卷调查、用户访谈等方法收集用户对功能的具体需求&#xff0c;特别是对安全、便捷性和费用分摊的关注点。竞品分析&#xff1a;分析同类…

开心第一课:健康坐姿

文章目录 引言保持脊柱的自然伸展选择一把合适的座椅引言 建议坐位时间超过 30 分钟,就起身活动一下,促进血液循环,预防久坐带来的各种健康问题。 保持脊柱的自然伸展 正确的骨盆位置是使坐位时身体重量都作用在双侧的坐骨结节上,在结节的顶端有滑囊,滑囊分泌液体减少组…

由“为什么VO不能继承PO?” 引出的为什么组合优于继承?

简述VO、DTO、PO的概念。 如下概念是我个人的理解&#xff1a; VO&#xff08;View Object&#xff09;&#xff1a; 视图对象&#xff0c;用于展示&#xff0c;这很好理解&#xff0c;就是前端页面所需数据封装&#xff0c;一般所需要的属性比 PO 多并且。DTO&#xff08;Da…