MySQL基础学习: 使用EXPLAIN查看执行计划详解分析

一、EXPLAIN语句的作用

在客户端执行MySQL的操作语句,会依次经过MySQL客户端连接管理、语法解析与优化(查询缓存、语法解析、查询优化)、存储引擎层。其中查询优化器在基于成本和规则对查询语句进行优化,并且在优化后会生成一个执行计划。MySQL提供了EXPLAIN语句来查看查询语句经过查询优化器优化后的执行计划。
在这里插入图片描述
定义本章所使用的表结构:

CREATE TABLE `source_learn` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `data_type` enum('oracle’,'mysql') DEFAULT 'oracle' COMMENT '源类型',
  `name` varchar(100) NOT NULL COMMENT '源名称',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

CREATE TABLE `source_learn_param` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `source_id` bigint(20) NOT NULL COMMENT '关联源id',
  `key` varchar(50) NOT NULL COMMENT '参数key',
  `value` text NOT NULL COMMENT '参数值',
  `data_type` enum('oracle','mysql') DEFAULT 'oracle' COMMENT '源类型',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `source_id_index` (`source_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

CREATE TABLE `table_test_learn` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `source_id` bigint(20) DEFAULT NULL COMMENT '源id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='元数据';


二、EXPLAIN语句的属性含义及作用

EXPLAIN语句包含如下属性列:

属性名说明
id每个SELECT对应的唯一id
select_type每个SELECT对应的查询类型
table表名称
paritions分区信息
type单表的访问方法
possible_keys可能使用到的索引
key实际使用的索引
key_len实际使用到的索引长度
ref
rows预计要读取到的记录数量
filtered
Extra额外的一些信息
1、id

在查询语句(经过查询优化器优化后的查询语句)中可能会包含多个SELECT语句,每个select语句都会对应一个唯一的id。并且查询计划会为每个表生成一个记录,但是这些记录的id可能存在相同的情况。
(1)简单的SELECT语句

explain select id,name from source_learn where data_type = 'oracle';

在这里插入图片描述
(2)包含子查询的SELECT语句

EXPLAIN select * from table_test_learn as test where test.source_id in (select source_learn.id from source_learn where source_learn.data_type = 'oracle');

在这里插入图片描述
可以看到这个子查询语句生成的执行计划中包含两条记录,这两条的分别对应表table_test_learn和表source_learn。这个查询语句包含了两个SELECT查询语句为什么id值是相同的呢?这里的id相同表示着:通过查询优化器对查询语句的优化,将子查询语句转变成了连接查询语句。

2、select_type

在一个查询语句中可能包含多个小的查询语句,在MySQL中每个小的查询语句都包含select_type属性,通过该属性的取值,我们可以判断出这个小的查询语句在整个查询语句中扮演着一个什么样的角色。该属性的取值如下:

取值说明
SIMPLE没有UNION或查询优化器优化后不包含子查询的语句
PRIMARY包含联合查询或查询优化器优化后包含子查询的,第一条记录的select_type的取值就是PRIMARY
UNION查询语句包含联合查询,除了第一个记录外,其余记录的select_type的取值是UNION
UNION RESULT对于UNION操作产生的临时表的select_type的取值为UNION RESULT
SUBQUERY对于非相关子查询的记录的select_type的取值为SUBQUERY
DEPENDENT SUBQUERY对于相关子查询的记录的select_type的取值为DEPENDENT SUBQUERY
DEPENDENT UNION
DERIVED
MATERIALIZED对于包含子查询的语句,存在需要将子查询物化后再参与连接查询,此时的select_type的取值为MATERIALIZED
(1)SIMPLE

下面展示了内连接查询语句的执行计划,在查询语句中不包含UNION和子查询,因此两条记录的select_type的取值都是SIMPLE。

EXPLAIN select * from source_learn inner join source_learn_param on source_learn.id = source_learn_param.source_id;

在这里插入图片描述

(2)PRIMARY、UNION、UNION RESULT

下面展示了查询语句中使用UNION关键字,其中语句最左边的是PRIMARY,其余的查询是UNION,UNION RESULT表示的是对于UNION的语句处理使用了临时表进行了去重处理。

EXPLAIN select data_type from source_learn UNION select data_type from source_learn_param;

在这里插入图片描述
下面展示了查询语句中使用了UNION ALL关键字执行计划详情
UNION ALL不会进行去重处理,因此没有产生临时表。

EXPLAIN select data_type from source_learn UNION ALL select data_type from source_learn_param;

在这里插入图片描述

(5)SUBQUERY

下面展示了查询语句在字段中使用了子查询操作,在左边的查询语句的的select_type为PRIMARY。剩下的一个查询语句查询优化器并为对其优化成连接查询的形式,并且改查询语句为非相关子查询,因此select_type为SUBQUERY。

EXPLAIN select source_learn.data_type, (select DISTINCT(source_id) from source_learn_param where source_learn_param.id = 1) as key_source_id from source_learn;

在这里插入图片描述

(6)DEPENDENT SUBQUERY

下面展示的是相关子查询查询计划记录的select_type的取值为DEPENDENT SUBQUERY。

  • where条件后面的相关子查询语句
EXPLAIN select source_learn.data_type from source_learn where source_learn.id in (select source_id from table_test_learn) or source_learn.data_type = "oracle";

在这里插入图片描述

  • 字段为相关子查询的语句
EXPLAIN select source_learn.data_type, (select DISTINCT(source_id) from source_learn_param where source_learn_param.data_type = source_learn.data_type) as key_source_id from source_learn;

在这里插入图片描述

(7)DEPENDENT UNION

在存在UNION的查询语句中如果各个子查询语句间存在依赖关系,者除了第一个记录的select_type为PRIMARY,其他的子查询语句记录中的select_type为DEPENDENT UNION

EXPLAIN select * from source_learn where id in (select source_id from source_learn_param where data_type = "oracle" UNION select id from source_learn where name='oracle_source')

在这里插入图片描述

(8)DERIVED
(9)MATERIALIZED

下面的查询语句展示了表table_test_learn子查询物化后参与连接查询。

EXPLAIN (select data_type from source_learn where source_learn.id in (select source_id from table_test_learn)) UNION ALL select data_type from source_learn_param;

在这里插入图片描述

3、table

无论我们写的SQL语句有多复杂,最终都会对单个表进行查询操作,查询计划会为每个表生成一条记录,记录中的table列就表示表的名字。

4、paritions

这个属性是有关分区表的相关查询操作,还未遇到过占不讨论,遇到了再做补充。

5、type
6、possible_keys
7、key
8、key_len
9、ref
10、rows
11、filtered
12、Extra

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

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

相关文章

AC修炼计划(AtCoder Beginner Contest 334)A~G

传送门:UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334) - AtCoder A题是最最基础的语法题就不再讲解。 B - Christmas Trees 该题虽然分低,但我觉得还是很不错的。 给你 l 和 r ,设满足题意的数字是x则…

深入解析JavaScript中构造函数和new操作符

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ 目录 ✨ 前言 ✨ 正文 第一节:构造函数 第二节:new操作符 第三节:实例与原型 ✨ 结语 ✨ 前言…

ssm基于java的自助医疗服务系统的设计与实现+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本自助医疗服务系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

C#MQTT编程04--订阅报文

1、报文回顾 在MQTT中,消息传递模式是采用发布订阅模式(Publish-Subscribe Pattern),它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立…

【python】07.字符串和常用数据结构

字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,最初计算机被应用于导弹弹道的计算,而在计算机诞生后的很多年时间里,计算机处理的信息基本上都是数值型的信息。世界上的第一台电子计算机叫ENIAC(电…

冠军获奖经历:这一路我们不孤单!

Datawhale干货 获奖:元贞、小罗,Datawhale优秀学习者 前 言 大家好,我是 2023 寻找游戏大模王 AI 原生应用大赛的 Top1 荆轲刺秦王团队的小罗,很高兴能在这里与大家分享我们这次比赛的经验,同时也希望以后有机会可以和…

华为常用的命令——display,记得点赞收藏!

华为设备提供了多条display命令用于查看硬件部件、接口及软件的状态信息。通常这些状态信息可以为用户故障处理提供定位思路。 常用的故障信息搜集的命令如下: 路由器常用维护命令表 交换机常用的故障信息搜集 关注 工 仲 好:IT运维大本营,获…

函数栈桢的创建和销毁

函数栈桢的创建和销毁 一、解决的问题二、认识常用的寄存器及其指令操作三、函数栈桢解析三、回答问题 一、解决的问题 1.局部变量是怎么创建的?  2.为什么局部变量的值是随机值?  3.函数是怎么传参的?传参的顺序是怎样的?  4.…

全新小白菜QQ云端机器人登录系统源码 /去除解密授权学习版源码

源码介绍: 全新小白菜QQ云端机器人登录系统源码,是一款经过全面解密的授权学习版源码。 这款源码已解除了授权版的限制,然而许多人可能对其用途并不了解。实际上,该源码主要面向群机器人爱好者设计。它是一个基于挂机宝机器人框…

【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 二分查找算法合集 位运算 LeetCode100160. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。 令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x 0 且…

css3背景与渐变

css3背景与渐变 前言背景颜色background-color基础知识背景图片background-image基础知识背景图片的重复模式 背景尺寸background-sizecontain和cover是两个特殊的background-size的值 背景裁切 background-clip背景固定 background-attachment背景图片位置 background-positio…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。 示例 1: 输入:root [1,null,…

虚拟机配置网络

1开启网络 右击打开属性配置ipv4 配置vm 配置系统 配置liunx网卡信息 vim /etc/sysconfig/network-scripts/ifcfg-ens33 打开电脑任务管理器

1.13寒假集训

晚上兼职下班回来才有时间写题&#xff0c;早上根本起不来 A: 解题思路&#xff1a;我第一开始以为只要满足两个red以上的字母数量就行&#xff0c;但是过不了&#xff0c;后面才发现是red字符串&#xff0c;直接三个三个判断就行。 下面是c代码&#xff1a; #include<io…

【GitHub项目推荐--一行命令下载全网视频】【转载】

项目地址&#xff1a;https://github.com/soimort/you-get 首先声明&#xff0c;请不要使用该项目从事违法活动哦~仅供学习使用&#xff01; 解决痛点 如果你上网的时候看了一些东西不错&#xff0c;想下载下来&#xff0c;或者在线观看喜欢的视频&#xff0c;但是没有找到网…

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(二)

引言&#xff1a;上一篇文章我们简单介绍了AD9129的基础知识&#xff0c;包括芯片的重要特性&#xff0c;外部接口相关的信号特性等。本篇我们重点介绍下项目中FPGA与AD9129互联的原理图设计&#xff0c;包括LVDS IO接口设计、时钟电路以、供电设计以及PCB设计。 LVDS数据接口设…

openssl3.2 - quic服务的运行

文章目录 openssl3.2 - quic服务的运行概述笔记运行openssl编译好的quic服务程序todo - 如果自己编译quic服务工程END openssl3.2 - quic服务的运行 概述 在看 官方 guide目录下的工程. 都是客户端程序, 其中有quic客户端, 需要运行quic服务才行. openssl编译好的目录中有编译…

基于Matlab/Simulink的MIL仿真验证解决方案

文章目录 需求追溯 虚拟环境 模型检查 仿真验证 测试报告 参考文献 针对模型开发阶段的ECU算法&#xff0c;可以很直接地将其与虚拟车辆模型连接起来&#xff0c;通过MIL对其进行验证和确认。可以在开发过程的早期检测到设计错误和不正确的需求&#xff0c;也有助于安全地…

UML-状态机图(状态图)

UML-状态机图&#xff08;状态图&#xff09; 一、状态机图简介1、状态&#xff08;1&#xff09;简单状态&#xff08;2&#xff09;并发状态2、转移&#xff08;1&#xff09;判定决策点&#xff08;2&#xff09;同步&#xff08;分叉与汇合&#xff09; 3、事件4、动作5、活…

C++ 输入用户名和密码 防止注入攻击

1、问题解释&#xff1a;注入攻击 &#xff0c;无密码直接登录数据库 可视化展示 1.1、当你的数据库为&#xff1a;其中包含三个字段id user 以及md5密码 1.2、在使用C堆数据库信息进行访问的时候&#xff0c;使用多条语句进行查询 string sql "select id from t_user…