17-Explain执行计划-01

news2024/11/19 2:49:17

Explain 执行计划

什么是执行计划

有了慢查询语句后,就要对语句进行分析。一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN 语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EPLATNEXPLAIN 的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能。
通过使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的。分析查询语句或是表结构的性能瓶颈,总的来说通过 EXPLAIN 我们可以

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

执行计划的语法

执行计划的语法其实非常简单:在 SQL 查询的前面加上 EXPLAIN 关键字就行。比如:

EXPLAIN select * from table1

重点的就是 EXPLAIN 后面你要分析的 SQL 语句除了以 SELECT 开头的查询语句,其余的 DELETE、INSERT、REPLACE 以及 UPDATE语句前边都可以加上 EXPLAIN,用来查看这些语句的执行计划,不过我们这里对 SELECT 语句更感兴趣,所以后边只会以 SELECT 语句为例来描述 EXPLAIN 语句的用法。

执行计划详解

为了让大家先有一个感性的认识,我们把 EXPLAIN 语句输出的各个列的作用先大致罗列一下:

explain select * from order_exp;

在这里插入图片描述
id: 在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的 id
select_type: SELECT 关键字对应的那个查询的类型
table:表名
partitions:匹配的分区信息
type:针对单表的访问方法
possible_keys:可能用到的索引
key:实际上使用的索引
key_len:实际使用到的索引长度
ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows:预估的需要读取的记录条数
filtered:某个表经过搜索条件过滤后剩余记录条数的百分比
Extra:—些额外的信息

看到这里,是不是一脸懵逼,这是正常的,这里把它们都列出来只是为了描述一个轮廓,随着我们课程的进行,我们会仔细讲解每个列的含义,显示值的含义。

为了方便学习,我们使用范例表 order_exp:

在这里插入图片描述
这个表在库中有个三个派生表 s1,s2,order_exp_cut,表结构基本一致,有少许差别:
在这里插入图片描述
注意:为了方便讲述,我们可能会适当调整对列的讲解顺序,不会完全按照 EXPLAIN语句输出列顺序来讲解。

table

不论我们的查询语句有多复杂,里边包含了多少个表,到最后也是需要对每个表进行单表访问的,MySQL 规定 EXPLAIN 语句输出的每条记录都对应着某个单表的访问方法,该条记录的 table 列代表着该表的表名。

在这里插入图片描述
可以看见,只涉及对 s1 表的单表查询,所以 EXPLAIN 输出中只有一条记录,其中的table 列的值是 s1,而连接查询的执行计划中有两条记录,这两条记录的 table 列分别是 s1和 s2.

id

我们知道我们写的查询语句一般都以 SELECT 关键字开头,比较简单的查询语句里只有
一个 SELECT 关键字,
稍微复杂一点的连接查询中也只有一个 SELECT 关键字,比如:

SELECT *FROM s1 INNER J0IN s2
ON s1.id = s2.id
WHERE s1.order_status = 0 ;

但是下边两种情况下在一条查询语句中会出现多个 SELECT 关键字:
1、查询中包含子查询的情况
比如下边这个查询语句中就包含 2 个 SELECT 关键字:

SELECT* FROM s1 WHERE id IN ( SELECT * FROM s2);

2、查询中包含 UNION 语句的情况
比如下边这个查询语句中也包含 2 个 SELECT 关键字:

SELECT * FROM s1 UNION SELECT * FROM s2 ;

查询语句中每出现一个 SELECT 关键字,MySQL 就会为它分配一个唯一的 id 值。这个id 值就是 EXPLAIN 语句的第一个列。

单 SELECT 关键字

比如下边这个查询中只有一个 SELECT 关键字,所以 EXPLAIN 的结果中也就只有一条id 列为 1 的记录∶

EXPLAIN SELECT * FROM s1 WHERE order_no = 'a';

在这里插入图片描述

连接查询

对于连接查询来说,一个 SELEOT 关键字后边的 FROM 子句中可以跟随多个表,所以在连接查询的执行计划中,每个表都会对应一条记录,但是这些记录的 id 值都是相同的,

比如:

EXPLAIN SELECT * FROM s1 INNER JOIN s2;

在这里插入图片描述
可以看到,上述连接查询中参与连接的 s1 和 s2 表分别对应一条记录,但是这两条记录对应的 id 值都是 1。这里需要大家记住的是,在连接查询的执行计划中,每个表都会对应一条记录,这些记录的 id 列的值是相同的。

包含子查询

对于包含子查询的查询语句来说,就可能涉及多个 SELECT 关键字,所以在包含子查询的查询语句的执行计划中,每个 SELECT 关键字都会对应一个唯一的 id 值,比如这样:

EXPLAIN SELECT * FROM s1 WHERE id IN (SELECT id FROM s2) OR order_no = 'a';

在这里插入图片描述
但是这里大家需要特别注意,查询优化器可能对涉及子查询的查询语句进行重写,从而转换为连接查询。所以如果我们想知道查询优化器对某个包含子查询的语句是否进行了重写,直接查看执行计划就好了,比如说:

EXPLAIN SELECT * FROM s1 WHERE id IN (SELECT id FROM s2 WHERE order_no = 'a');

在这里插入图片描述
可以看到,虽然我们的查询语句是一个子查询,但是执行计划中 s1 和 s2 表对应的记录的 id 值全部是 1,这就表明了查询优化器将子查询转换为了连接查询,

包含 UNION 子句

对于包含 UNION 子句的查询语句来说,每个 SELECT 关键字对应一个 id 值也是没错的,不过还是有点儿特别的东西,比方说下边这个查询:

EXPLAIN SELECT * FROM s1 UNION SELECT * FROM s2;

在这里插入图片描述

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

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

相关文章

Java基于springboot +vue的箱包销售购物网站 多商家

随着人们生活的节奏越来越快,很多时候人们在外出的时候会有大包小包。所以这个时候如何选择适合自己的物美价廉的箱包是一个很重要的环节。选对了箱包不仅能够增加大街上的回头率同时也能够方便自己的出行。当前箱包市场鱼目混杂且价格昂贵。随着互联网的发展&#…

intellij plugin(插件)的项目解析及研读

文章目录资料action_basics (基本的响应操作)plugin.xmlCustomDefaultActionGroupPopupDialogActionDynamicActionGroupcomparing_references_inspection (关注代码提示)conditional_operator_intention [未成功复现]editor_basics (选择文字替换等)Caret PositionEditor Add C…

java项目-第137期jsp+servlet的周公算命预测系统-java毕业设计

java项目-第137期jspservlet的周公算命预测系统-计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《周公算命预测系统》 该项目分为管理员和普通用员2个角色。 管理员主要负责后台的信息维护:算命分类管理(比如八字、星座、相命)、管理员信息管理、用户信…

实用数据结构【并查集】 - 原理

实用数据结构【并查集】 - 原理 [一个问题] 若某个部落过于庞大,则部落成员见面也有可能不认识。 已知某个部落的成员关系图,任意给出其中两个人,判断是否有亲戚关系。规定:①若x、y 是亲戚,y 和z 是亲戚&#xff0…

【C++】string的模拟实现

目录 一、std::swap和std::string::swap的区别 二、string的默认构造函数 1、构造函数 2、拷贝构造 3、赋值运算符重载 4、析构函数 三、string中的小接口 四、遍历接口的实现 1、对operator[]进行重载 2、迭代器 五、reserve和resize 六、插入删除查找相关接口 1…

DirtyCow脏牛漏洞复现(CVE-2016-5195)

DirtyCow脏牛漏洞复现 本文以vulnhub靶场中的lampiao为例复现脏牛提权漏洞 扫描c段 nmap -sS -Pn 192.168.1.0/24找到疑似ip 对该ip端口进行扫描,多扫出个1898端口 nmap -A -sV -p- 192.168.1.13访问80端口,没有有用的信息 1898也是个apche的http服务…

立足小餐饮,“新名酒”江小白能走多远?

(图片来源于网络,侵删) 来源 | 螳螂观察 文 | 叶小安 白酒市场从不缺新故事,但一直缺年轻人喜欢的白酒。 上月底,江小白旗下江记酒庄获重庆市江津区华信集团10亿元战略投资。与此同时,江小白产品理念升…

技术贴 | Rocksdb 中 Memtable 源码解析

一、什么是 Memtable? Memtable 是 Rocksdb 在内存中保存数据的一种数据结构,一个 Memtable 的容量是固定的,在 Memtable 写满后,会转换为 Immutable Memtable,Immutable Memtable 中的数据会 Flush 到 SST File 中。…

编程中老生常谈的【编码规范】你还记得多少?进来回顾一下吧【文末送书】

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity精品学习专栏 🌲 游戏制作专栏推荐:游戏制作分享 &…

【genius_platform软件平台开发】第八十一讲:ARM Neon指令集一(ARM NEON Intrinsics, SIMD运算, 优化心得)

1. ARM Neon Intrinsics 编程 1.入门:基本能上手写Intrinsics 1.1 Neon介绍、简明案例与编程惯例 1.2 如何检索Intrinsics 1.3 优化效果案例 1.4 如何在Android应用Neon 2. 进阶:注意细节处理,学习常用算子的实现 2.1 与Neon相关的ARM体系结…

寻 友 软 件

寻友软件项目技术技术功能部署Redis部署RocketMQJWT(Json Web Token)虹软人脸识别部署MongoDB(尽量不用docker部署mongo)部署Nginx过滤器及拦截器加缓存编码流程DOC接口文档bug技术 技术 前端: flutterandroid环信S…

分销微信小程序介绍_分销小程序有什么作用呢

不同的微商城系统对于分销功能的支持会有不要的叫法,一般来说主要有两种,一种是基于商品分享的分销方式,通过分享链接识别客户从属关系,订单完成,结算佣金;另一种分销商可以建立并独立运营一个分销店铺&…

【JavaSE】关于多态那些事儿

目录 1. 多态 1.1 多态的概念 1.2 多态实现条件 1.3 向上转型 1.3.1 直接赋值 1.3.2 方法传参 1.3.3 方法返回 1.3.4 向上转型的优缺点 1.4 重写 1.4.1 重写的条件 1.4.2 重写注意事项 1.4.3 重载与重写的区别 1.5 通过父类的引用,调用这个父类和子类重…

CSS篇十六——盒子模型之边框

目录一、CSS盒子模型1.1 盒子模型组成1.2 边框(border)1.2.1 语法格式1.2.2 边框样式 border-style1.2.3 代码示例1.3 表格的细线边框1.3.1 语法格式、代码示例及结果一、CSS盒子模型 网页布局过程: 1.先准备好相关的网页元素,网…

My sql的深度剖析

一.数据库的创建、删除、使用 数据库的创建:create database 数据库名 数据库的删除:drop database 数据库名; 数据库的使用:use数据名; 所有数据库的查看:show databases; 建立数据时如何指定字符集…

在Java中计算Levenshtein莱文斯坦(相似度)编辑距离

在本教程中,我们将研究 Levenshtein 距离算法,该算法也称为编辑距离算法,用于比较单词的相似性。 什么是列文施泰因距离 Levenshtein距离算法由俄罗斯科学家Vladimir Levenshtein创建。 Levenshtein 距离算法通过计算将一个字符串转换为另…

基于单片机的贪吃蛇设计

1 绪论 1.1 设计目的 在21世纪的今天,人们的生活开始变得更加丰富多彩。在繁忙的工作之余,娱乐成为人们生活不可或缺的一份子,而游戏作为近年来逐渐兴起的一种娱乐方式,已经越来越受到人们的青睐。在工作学习之余&#…

dreamweaver网页设计作业制作 学生NBA篮球网页 WEB静态网页作业模板 大学生校园篮球网页代码 dw个人网页作业成品

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

第五章:双指针与离散化的映射

第五章:双指针、离散化、二进制运算与区间合并一、双指针1、什么是双指针?2、双指针的模板3、双指针例题(1)思路:(2)解答:C版:C版:二、离散化1、什么是离散化…

java面试强基(3)

重载和重写的区别? 重载 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。 重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理。 重写 重写发生在运行期,…