彻底搞懂MySQL的执行计划

欢迎关注微信公众号:互联网全栈架构

MySQL执行计划(EXPLAIN)可以提供SQL运行的一些信息,相当于模拟SQL的执行,从而让我们可以对SQL语句做更深入的分析和了解。在实际开发过程中,我们经常会使用执行计划来分析和提升SQL的执行效率。

EXPLAIN的使用也非常简单,在现有的SQL语句前面加上关键字EXPLAIN,然后直接执行即可。

创作不易,如果文章对你有帮助,请在文末点个在看,非常感谢!

一、准备工作

关于MySQL执行计划的介绍,很多文章都是干巴巴地把知识点罗列出来,然后做一下解释,这种形式很难让人印象深刻,所以我们还是结合具体的例子进行讲解,这样就直观得多。

还是先创建两张表,一张是订单表,一张是客户表,订单表中的字段customer_id与客户表的主键关联。数据表创建完成后,再往表里插入简单的测试数据:

先是订单表:

CREATE TABLE `t_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `order_no` int(11) DEFAULT NULL COMMENT '订单号',
  `customer_id` int(11) DEFAULT NULL COMMENT '客户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 插入数据
INSERT INTO `t_order` VALUES ('1', '1001', '1');
INSERT INTO `t_order` VALUES ('2', '1002', '26');

然后是客户表:

CREATE TABLE `t_customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `customer_name` varchar(255) DEFAULT NULL COMMENT '客户姓名 ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 插入数据
INSERT INTO `t_customer` VALUES ('1', 'John');
INSERT INTO `t_customer` VALUES ('2', 'Tom');

二、执行计划初窥

执行下面的SQL,看看是什么结果:

EXPLAIN SELECT * FROM t_order

39e0a6d085ce6790f11a46861f2d1b4a.png

可以看出,这个EXPLAIN返回了很多列,每个列的含义如下:

e11372f4f46aa64c9def375a0a6d66d2.png

三、执行计划详解

对于执行计划中的每个列,我们分别进行讲解:

1. id: 

表示SELECT语句执行的顺序,id相同时,从上到下的顺序执行,id值越大,优先级越高,就越先执行,如果是子查询,id的值会递增。比如我们执行下面的SQL后,子查询的id为2,它会先执行:

EXPLAIN SELECT (SELECT customer_id FROM t_order WHERE id = 1) FROM t_order der;

016cc9b1c6059dda2b41caf513f64b6f.png

2. select_type: 

表示查询的类型,比如普通查询、联合查询、子查询等,常用的值有如下这些:

SIMPLE:没有子查询或者UNION

PRIMARY:包含复杂子查询的最外层SELECT

UNION:对于包含UNION或者UNION ALL的复杂查询来说,最左边的为PRIMARY,其余查询的select_type为UNION

UNION RESULT:UNION会进行去重(UNION ALL则不会),这样就会有临时表,而针对该临时表的查询select_type就是UNION RESULT

比如下面的SQL,可以说明UNION的情况:

EXPLAIN SELECT * FROM t_order WHERE id = 1 
UNION SELECT * FROM t_order WHERE id = 2;

070957f3876f02ae807c38525e8b2ab6.png

其它常见的select_type还有SUBQUERY和DERIVED。

3. table: 

查询的表名,可能是真实的表名或者别名,也可能是以几种情况:

<unionM,N>:union查询产生的结果,M、N分别掼执行计划id值。比如上一节的例子里面就是这种情况

<derivedN>:N为派生表的id值。派生表可能来源于FROM语句中的子查询

<subqueryN>:N为物化子查询结果的id值

4. partitions: 

如果是分区表的话,表示查询匹配行所在的分区,否则为NULL值

5. type: 

表示数据表关联的类型,常见的一些类型如下,按性能从高到低排列:

5487ebd076bfc4f5b52ae7dca7c88d31.png

6. possible_keys和key: 

possible_keys表示可能会用到的索引,当然,在实际查询的时候也可能不会走索引,它主要用于优化查询的性能:如果它的值为NULL,那么就说明没有走索引。而key表示实际用到的索引,它也不一定都来自于possible_keys中的值,MySQL的优化器会找到它认为最优的选择。

比如我们给表t_order的字段customer_id加一个索引:

ALTER TABLE `t_order`
ADD INDEX `idx_customer` (`customer_id`) USING BTREE ;

然后我们按照客户id查询:

2daa8cc3dbc3fe614365f92f5564bfe2.png

可以看到SQL可能用到,以及实际用到的索引。

7. key_len: 

索引使用的字节数,越短越好。

8. ref: 

表示索引的哪一列被使用了,有可能是常数。

9. rows: 

为了执行查询,MySQL需要搜索的行数,它是一个预估值。

10. filtered: 

表示满足条件的行数占预估行数rows的百分比,最大值是100。

11. extra: 

查询的额外信息,比较常见的有:

Using index:使用了覆盖索引

Using Temporary:使用了临时表保存中间结果

Using filesort:使用外部排序而不是索引排序

其它的额外信息,请参见MySQL官网。

鸣谢:

https://dev.mysql.com/doc/refman/5.7/en/

https://www.sitepoint.com/using-explain-to-write-better-mysql-queries/

推荐阅读:

图解MySQL中的各种JOIN:再也不用担心记不住了

初级工程师一脸懵逼,高级工程师笑而不语

数据同步的利器:Canal

拒绝空谈:实例演示MySQL事务隔离级别

聊聊MySQL中的死锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编写fastapi接口服务

FastAPI是一个基于 Python 的后端框架&#xff0c;该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制&#xff0c;使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1&#xff1a;安装必要库 pip install fastapi uvicorn st…

FLStudio21中文版水果编曲软件好用吗?如何下载最新版本

FL Studio21版是一款在国内非常受欢迎的多功能音频处理软件&#xff0c;我们可以通过这款软件来对多种不同格式的音频文件来进行编辑处理。而且FL Studio 21版还为用户们准备了超多的音乐乐器伴奏&#xff0c;我们可以直接一键调取自己需要的音调。 FL Studio21版不仅拥有非常…

基于TM的遥感数据的叶面积指数估算解决方案

1.背景与技术路线 叶面积指数是重要的植被结构参数&#xff0c;反演叶面积指数是植被遥感的重要研究内容之一&#xff0c;其影响生态系统的物质和能量循环&#xff0c;成为作物生长、路面过程、水文和生态等模型的输入参数或状态变量。今年来&#xff0c;对也铭记指数的反演已…

vue-awesome-swiper轮播组件

安装版本&#xff1a;"swiper": "^6.0.0", 安装版本&#xff1a;"vue-awesome-swiper": "^4.1.1", <div class"swiper_conter"><swiper class"swiper" :options"swiperOption" ref"mySw…

Windows系统配置pytorch环境,Jupyter notebook编辑器安装使用(深度学习本地篇)

如今现在好一点的笔记本都自带英伟达独立显卡&#xff0c;对于一些简单的深度学习项目&#xff0c;是不需要连接服务器的&#xff0c;甚至数据量不大的话&#xff0c;cpu也足够进行训练学习。我把电脑上一些以前的笔记整理一下&#xff0c;记录起来&#xff0c;方便自己35岁事业…

快速构建空间场景轻应用的一次体验分享

零&#xff1a;前言 最近虚竹哥发现一款基于Web端打造的轻量化工具创作平台&#xff0c;用于快速构建空间场景轻应用&#xff0c;它就是Mapmost Alpha。内置丰富且多样化风格的三维场景、三维模型、数据服务、POI数据、图片、视频、网页等资源&#xff0c;通过拖拉拽的方式&am…

YOLOv8改进 | 主干篇 | RevColV1可逆列网络(特征解耦助力小目标检测)

一、本文介绍 本文给大家带来的是主干网络RevColV1&#xff0c;翻译过来就是可逆列网络去发表于ICLR2022&#xff0c;其是一种新型的神经网络设计(和以前的网络结构的传播方式不太一样)&#xff0c;由多个子网络&#xff08;列&#xff09;通过多级可逆连接组成。这种设计允许…

JavaScript进阶(事件+获取元素+操作元素)

目录 事件基础 事件组成 执行事件的步骤 获取元素 根据ID获取元素 根据标签名获取元素 获取ol中的小li 类选择器&#xff08;html5新增的I9以上支持&#xff09; 获取body和html 操作元素 innerText和innerHtml 表单标签 样式属性操作 操作元素总结 事件基础 事…

铁山靠之——HarmonyOS组件 - 2.0

HarmonyOS学习第二章 一、HarmonyOS基础组件的使用1.1 组件介绍1.2 Text1.2.1 文本样式1.2.2 设置文本对齐方式1.2.3 设置文本超长显示1.2.4 设置文本装饰线 1.3 Image1.3.1 设置缩放类型1.3.2 加载网络图片 1.4 TextInput1.4.1 设置输入提示文本1.4.2 设置输入类型1.4.3 设置光…

关于Python里xlwings库对Excel表格的操作(十八)

这篇小笔记主要记录如何【设置单元格数据的对齐方式】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下…

MySQL递归公用表表达式

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;MySQL知识 &…

【单调队列】LeetCode1499:满足不等式的最大值

涉及知识点 单调队列 题目 给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标&#xff0c;并按照横坐标 x 的值从小到大排序。也就是说 points[i] [xi, yi] &#xff0c;并且在 1 < i < j < points.length 的前提下&#xff0c; xi &…

【低照度图像增强系列(2)】Retinex(SSR/MSR/MSRCR)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

nosql--RedisTemplate定制化

nosql--RedisTemplate定制化 1、序列化2、如果使用redis中保存数据会使用默认的序列化机制&#xff0c;导致redis中保存的对象不可视2.1将所有的对象以JSON的形式保存2.2配置reids自定义配置2.3转化成功2.4配置文件代码 3redis客户端 1、序列化 stringRedisTemplate RedisTemp…

虚拟机Windows Server 2012 与ubuntu的安装与布置

介绍虚拟机 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种通过软件模拟的计算机系统&#xff0c;可以在一台物理计算机上同时运行多个独立的操作系统和应用软件。虚拟机将物理计算机的硬件资源&#xff08;如处理器、内存、硬盘等&#xff09;虚拟化…

vue3 全局配置Axios实例

目录 前言 配置Axios实例 页面使用 总结 前言 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境。它提供了一种简单、一致的 API 来处理HTTP请求&#xff0c;支持请求和响应的拦截、转换、取消请求等功能。关于它的作用&#xff1a; 发起 HTTP …

ARM Cortex-A学习(1):GIC(通用中断控制器)详解

文章目录 1 Cortex-A核中断1.1 处理器模式1.2 IRQ模式 2 GIC的操作2.1 CPU Interface2.2 Distributor GIC(通用中断控制器, Generic Interrupt Controller)是一种用于处理中断的硬件组件&#xff0c;它的主要功能是协调和管理系统中的中断请求&#xff0c;确保它们被正确地传递…

MYSQL一一函数一一流程函数

咱今天讲的是MySQL函数中的流程函数&#xff0c;会有3小题和一个综合案例帮助大家理解 流程函数是很常用的一类函数&#xff0c;可以在SQL语句中实现条件筛选&#xff0c;从而提高语句的效率 小题&#xff1a; ①if语句&#xff1a; select if(flash,ok,error); //如果…

SpringBoot 3.2.0 基于SpringDoc接入OpenAPI实现接口文档

依赖版本 JDK 17 Spring Boot 3.2.0 SpringDoc 2.3.0 工程源码&#xff1a;Gitee 导入依赖 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEnco…

Modbus转Profinet网关解决设备通讯不稳的问题

通讯不稳定&#xff1a;表现为数据断断续续&#xff0c;多半是由于线路干扰、接口不匹配、程序不稳定、等原因造成。 解决方案&#xff1a;在原配电柜添加Modbus转Profinet网关&#xff08;XD-MDPN100/2000&#xff09;即可解决通迅该问题&#xff0c;Modbus转Profinet网关&…