MySQL 执行计划详解

news2024/9/8 22:57:50

文章目录

  • 一. 概念
  • 二. 语法
  • 三. 详解各字段
    • 1. id
    • 2. select_type
    • 3. table
    • 4. partitions
    • 5. type
    • 6. possible_keys与key
    • 7. key_len
    • 8. ref
    • 9. rows
    • 10. filtered
    • 11. Extra

一. 概念

有了慢查询后,需要对慢查询语句进行分析。一条查询语句经过MySQL查询优化器后,基于各种成本和规则优化后生成一个所谓的执行计划。

这个执行计划揭露了接下来执行查询的方式。比如多表连接查询的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。

EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EXPLAIN的各个输出项字段的作用,从而可以针对性提升查询语句的性能。

通过EXPLAIN关键字可以模拟优化器执行SQL查询语句,进而知道MySQL如何处理SQL的。分析查询语句或者表结的性能瓶颈,可以通过EXPLAIN解析,如:

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 哪些索引会被使用
  4. 哪些索引实际被使用
  5. 使用索引实际的字节数
  6. 表之间的引用
  7. 每张表有多少行被优化器查询

二. 语法

执行计划的语句:EXPLAIN + SQL语句

EXPLAIN select * from table

除了select,其余的delete,update,insert,replace语句前都可以加EXPLAIN,用来查询语句的执行计划。

三. 详解各字段

先对explain输出各个列的作用大致罗列下:

  1. id:在一个大的查询语句中每个select关键字都对应一个唯一id
  2. select_type:select *关键字对应的查询的类型。
  3. table:表名。
  4. partitions:匹配的分区信息。
  5. type:针对单表的访问方法。
  6. possible_keys:可能用懂啊的索引。
  7. key:实际用到的索引。
  8. key_len:实际使用到的索引长度。
  9. ref:当使用索引列等值查询时,与索引列进行等值匹配对象的信息。
  10. rows:预估需要扫描的行数。
  11. filtered:某个表经过搜索条件后过滤剩余记录条数的百分比。
  12. Extra:额外的信息。

1. id

id列编号是select的序列号。有几个select就有几个id。

  1. id相同,执行顺序由上到下

    explain select * from a inner join b on a.id = b.id
    

    在这里插入图片描述

  2. id不同,如果子查询,id的序号递增,id值越大优先级越高,越先执行。

  3. id有null最后执行。

    explain select * from a union select * from a;
    

    在这里插入图片描述

2. select_type

代表对应行是简单还是复杂的查询。

⭐️类型:

  1. SIMPLE:简单查询,查询不包含子查询和union。

    explain select * from a;
    
    explain select * from a inner join b on a.id = b.id;
    
  2. PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
    在这里插入图片描述

  3. SUBQUERY:select、where之后包含了子查询,在select语句中出现的子查询语句,结果不依赖于外部查询(不在from语句中)。

  4. DEPENDENT SUBQUERY:指在select语句中出现的查询语句,结果依赖于外部查询
    在这里插入图片描述

  5. DEPENDENT SUBQUERY:指在select语句中出现的查询语句,结果依赖于外部查询

    在这里插入图片描述

  6. DERIVED:在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放在临时表中。

    派生表是在一个查询中定义的一个临时表,它由一个子查询生成,但不是作为查询的一部分返回,而是作为外部查询的一部分来引用。派生表通常用在FROM子句中,看起来像是一个普通的表名,但实际上是一个子查询的结果集。

    -- 关闭对衍生表合并优化
    set session optimizer_switch='derived_merge=off';
    -- 查看optimizer_switch参数
    show variables like '%optimizer_switch%';
    -- 
    explain select * from (select * from a) as t; 
    -- 还原表合并优化
    set session optimizer_switch='derived_merge=on';
    

    在这里插入图片描述

  7. UNION:若第二个select出现在UNION后,则被标记为UNION

    explain select * from a union select * from a
    
  8. UNION RESULT:UNION关键字会将数据结果进行去重,会使用一个临时表,临时表的记录会被标记为UNION RESULT

    explain select * from a union select * from a
    
  9. DEPENDENT UNION :当一个UNION操作符连接的查询中,至少有一个查询依赖于外部查询的某个值时,这样的查询被称为DEPENDENT UNION

    explain select * from a where id in (select id from a union select id from a)
    

    在这里插入图片描述

3. table

该行数据属于哪张表。

4. partitions

和分区相关,一般情况下查询语句的执行计划的partitions列的值都是NULL

5. type

执行计划的一条记录代表着MySQL对某个表的执行查询时的访问方法/访问类型.

其中type就表明这个访问方法/访问类型,较为重要的一个指标,结果值从最好到最坏排序:

常用的:

system > const > eq_ref > ref > range > index > all

全type的:

system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all。

一般来说至少达到range级别,最好达到ref。

⭐️类型:

  1. system:系统表,少来给你数据,往往不需要磁盘IO。或者当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory

  2. const:当我们根据主键或者唯一索引列等值匹配时。

    explain select * from a where id = 1
    

    在这里插入图片描述

  3. eq_ref:进行多表连接查询,被驱动表通过主键或唯一索引进行等着查询。

    explain select * from a join b on a.id = b.id
    

    在这里插入图片描述

  4. ref:普通二级索引等值查询。

    create index idx_index on a (user_name);
    
    explain select * from a where user_name = ''
    

    在这里插入图片描述

  5. ref_or_null:命中索引时,查询条件除了等值查询,还包含null值查询。

    create index idx_index on a (user_name);
    
    explain select * from a where user_name = '' or user_name is null;
    

    在这里插入图片描述

  6. index_merge:查询条件命中多个索引情况下

    create index idx_index on a (user_name);
    create index idx_index2 on a (sex);
    
    explain select * from a where user_name = '' or sex = 1;
    

    在这里插入图片描述

  7. unique_subquery:查询条件包含子查询,并且子查询的列可以进行主键等值匹配。

  8. index_subquery:查询条件包含子查询,并且子查询的列可以通过索引进行等值匹配。

  9. range:命中索引时,查询某一个范围内的结果。

    create index idx_index on a (user_name);
    
    explain select * from a where user_name > '张';
    

    在这里插入图片描述

  10. index:直接在某个索引树上做条件判断,并且不需要回表。

create index idx_index on a (user_name, sex);

-- 虽然没满足左前缀,但可以遍历idx_index的B+Tree,找到sex等于1记录
-- 查询结果的user_name在联合索引上,不用回表,此时就可以用index
explain select user_name from a where sex = 1;

在这里插入图片描述

  1. all:直接遍历整个聚簇索引。

    explain select * from a
    

    在这里插入图片描述

6. possible_keys与key

possible_keys代表可能用到的索引。

key代表实际用到的索引。

7. key_len

key_len代表优化器决定使用某个索引执行查询时,该索引记录的最大长度。

计算原理

对于固定长度类型的索引列来说,它实际占用的存储空间的最大长度为该索引的固定值。对于指定字符集的变长类型的索引列来说

如varchar(10),使用的字符集是utf8(1个字符占用3个字节),那么该列实际占用的最大存储空间是10 * 3 + 2 + 1 = 33 byte。

如果可以存储null值,key_len比不可存储NULL多1个字节。对于varchar来说是长度可变字段,还会有2个字节的空间来存储该字段变长列的实际长度。

如int,为4个字节。

如datetime,为6个字节。

MySQL执行计划中输出key_len列柱用为了让我们区分某个使用联合索引的查询具体用了几个索引。

8. ref

这一列表明了在key列记录的索引中,表查找值所用到的列或常量

  1. const 或 NULL:
    • const: 当查询使用常量作为索引查找的键值时,ref 列将显示为 const。这通常发生在查询中使用了常量值(如数字或字符串字面量)作为WHERE子句的一部分。
    • NULL: 当查询不使用索引或者使用全表扫描时,ref 列将显示为 NULL
  2. 表名.列名:
    • 当查询使用某个表的列作为索引查找的键值时,ref 列将显示为 <table_name>.<column_name>。这意味着查询使用了索引查找来定位行。
    • 如果查询涉及到多个表并且使用了某个表的列来查找另一个表中的行,则ref列将显示为前一个表的列名。
  3. func:
    • 当查询使用函数作为索引查找的键值时,ref 列将显示为 func。这通常发生在查询中使用了函数(如LOWER()CONCAT())来处理索引列。
  4. 索引名称:
    • 有时ref列也可能包含索引名称,这通常发生在查询使用了特定索引来查找行。

9. rows

如果查询优化器决定使用全表扫描方式对某个表执行查询时,执行计划的row列的代表的预计需要扫描的行数。

如果使用索引查询,rows代表预计扫描索引行数。

10. filtered

表示在JOIN操作中,前一个表的行数据被过滤的比例。

11. Extra

Extra列是用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句

  • using index:使用覆盖索引会出现。
  • using where:在查找使用索引情况下,需要回表去查询所需数据。
  • using condition:查找使用了索引,但需要回表查询数据。
  • using index & using where:查找使用了索引,但需要的数据都在索引列中找到,所以不需要回表查询数据

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

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

相关文章

最全国内13家DNS分享 解决网页被恶意跳转或无法打开问题

腾讯 DNS (DNSPod) 腾讯 DNS 是由 DNSPod 提供的公共免费 DNS 服务。DNSPod 已被腾讯收购&#xff0c;现在属于腾讯公司所有。该 DNS 服务稳定性和连通性良好&#xff0c;经测试在海外也可以使用。 DNSPod 提供了 IPv4、IPv6 DNS 和 DoT/DoH 服务。 IPv4 地址: 119.29.29.29…

fastapi教程(五):中间件

一&#xff0c;什么是中间件 中间件是一种软件组件&#xff0c;它在请求到达应用程序处理程序之前和/或响应发送回客户端之前执行操作。 请求从客户端发出。 请求首先经过Middleware 1。 然后经过Middleware 2。 请求到达FastAPI路由处理器。 响应从路由处理器返回。 响应经过…

精品PPT | 云原生大数据平台构建及落地实践.pptx

1、监控和可观测性的关系及渊源 2、当前阶段落地可观测性的挑战在哪里 3、落地好一个可观测系统的三大要素 4、面向故障处理过程的可观测性体系建设案例 5、思考&#xff1a;人工智能2.0对可观测性技术和产品演进的影响

鸿蒙开发—黑马云音乐之Music页面

目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果&#xff1a; 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…

环形链表 II - 力扣(LeetCode)C语言

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; (点击前方链接即可查看题目) 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达…

制造企业选型MES管理系统时需要关注的地方

在当今制造业全面拥抱数字化转型的浪潮中&#xff0c;MES管理系统解决方案的角色日益凸显&#xff0c;成为提升生产效率、优化资源配置的关键工具。对于制造企业而言&#xff0c;选择一款合适的MES管理系统不仅关乎当前的生产管理需求&#xff0c;更直接影响到企业未来的竞争力…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

【权威发布】第二届机械电子工程与软件工程国际会议(MEESE 2024)

第二届机械电子工程与软件工程国际会议 2024 International Conference on Mechanical and Electronic Engineering and Software Engineering 【1】会议简介 第二届机械电子工程与软件工程国际会议是一个专注于机械电子工程与软件工程领域交叉融合的国际盛会。会议旨在汇聚全球…

Vue3可媲美Element Plus Tree组件研发之重命名节点

在上一节《移除节点》基础上继续迭代JuanTree的功能&#xff0c;我们将实现节点重命名的功能。 实现效果&#xff1a; 可以对现有节点进行编辑&#xff0c;点回车或失去焦点完成编辑&#xff0c;如果输入为空&#xff0c;会恢复为原来的值。同时支持对新增的节点自动启用编辑功…

花几千上万学习Java,真没必要!(三十四)

1、泛型类&#xff1a; 测试代码&#xff1a; 创建一个Box类; package settest.com; public class Box<T> { // T stands for "Type" - T是一个占位符&#xff0c;用于表示具体的类型 // 类的内部可以使用T作为类型声明变量 private T t; // 构造方法&am…

ROS中使用rqt_plot快速实现数据可视化

对数据进行可视化有很多好处&#xff0c;比如可以帮助我们快速判断机器人运动轨迹是否平滑。 一般来说&#xff0c;我们会将数据保存为文件&#xff0c;然后进行绘图&#xff0c;但是在ROS中&#xff0c;有一个很好用的工具&#xff0c;叫rqt_plot&#xff0c;用它可以快速实现…

力扣高频SQL 50题(基础版)第二十四题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题1729.求关注者的数量题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题 1729.求关注者的数量 题目说明 表&#xff1a; Followers ----------------…

Maven已经导入Junit包,但是还是无法使用注解

Maven已经导入Junit包&#xff0c;但是还是无法使用注解 背景&#xff1a; 导入了Junit的依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></d…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十五章 Linux I2C驱动实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Qt编写自定义控件:跑马灯文本控件

#ifndef RUNNINGTEXTWIDGET_H #define RUNNINGTEXTWIDGET_H#include <QWidget>enum Direction {North 0, //上South, //下West, //左East //右 };class RunningTextWidget : public QWidget {Q_OBJECT public:explicit RunningTextWidget(QWidget *parent nullptr);…

第二期:集成电路(IC)——智能世界的微观建筑大师

嘿&#xff0c;小伙伴们&#xff01;&#x1f44b; 我是你们的老朋友小竹笋&#xff0c;一名热爱创作和技术的工程师。上一期我们聊了聊AI芯片&#xff0c;这次我们要深入到更微观的层面&#xff0c;来探究集成电路&#xff08;IC&#xff09;的世界。准备好一起探索了吗&#…

50+受高度近视屈光参差与白内障阻碍,巫雷院长一场手术“均衡”双眼

周女士双眼近视度数一直差异很大&#xff0c;这么多年从未看清。“这次”是因为发现视力逐渐下降检查得知并发性白内障&#xff0c;以屈光性白内障手术得以一次性治疗多个问题。 周女士小时候就近视了&#xff0c;那时家里不重视&#xff0c;且自己觉得戴眼镜“不好”&#xf…

强制重新启动 iPhone

官网&#xff1a;https://support.apple.com/zh-cn/guide/iphone/iph8903c3ee6/ios 按住调高音量按钮&#xff0c;然后快速松开。按住调低音量按钮&#xff0c;然后快速松开。按住侧边按钮。当 Apple 标志出现时&#xff0c;松开侧边按钮。