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

news2024/9/24 7:17:52

一、EXPLAIN语句的作用

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

二、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

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

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

相关文章

安装、运行和控制AI apps在您的计算机上一键式

pinokio 你是否曾为安装、运行和自动化 AI 应用程序和大模型而感到困惑?是否希望有一个简单而强大的工具来满足你的需求?如果是这样,那么 Pinokio 将会是你的理想选择!Pinokio 是一款革命性的人工智能浏览器,是一个开…

51单片机点阵开发

一.LED点阵屏 LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏、银行窗口屏叫号屏以及停车系统等等。 …

牛客(JZ36 二叉搜索树与双向链表)

题目链接 思路1:使用中序遍历, 创建一个cur记录当前结点,prev记录上一个结点,这样cur->left prev,prev->right cur, 这样就链接 成功了。 难点:需要使用引用来控制prev。 /* struct T…

C# IOC 容器实战:KeyedService和生命周期

文章目录 前言KeyedServiceKey缺少Key值覆盖 KeyedService.AnyKey生命周期测试代码 总结 前言 我之前写过一篇Ioc容器的使用,用的是微软的IOC容器。这次我们再去深入了解一下IOC 和控制反转 .NET Core 依赖注入 Microsoft.Extensions.DependencyInjection ASP.NET …

js 实现拖动按钮添加布局

效果&#xff1a; h布局生成左右布局&#xff0c; v布局生成上下布局 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, ini…

【MATLAB源码-第104期】基于matlab的MPSK和MQAM调制解调方式仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 MPSK&#xff08;多相位键控&#xff09; MPSK是一种基于载波相位变化的数字调制技术。它的核心原理是通过改变载波的相位来表示不同的数字信息。这种技术可以分为几个不同的级别&#xff0c;其中最常见的包括&#xff1a; 1…

用sql计算两个日期的间隔天数 ,去除周末

快递行业&#xff0c;经常需要计算2个节点的时效&#xff0c;有的计算自然日&#xff0c;有时候需要计算去掉周末的时效&#xff0c;计算自然日很简单&#xff0c;用函数datediff 就可以了&#xff0c;计算工作日时效&#xff0c;我的实现方法如下&#xff0c;借助了一个日期维…

GSTAE

缺失数据的流量预测:一种多任务学习方法 摘要:基于真实交通数据的交通速度预测是智能交通系统(ITS)中的一个经典问题。大多数现有的交通速度预测模型都是基于交通数据完整或具有罕见缺失值的假设而提出的。然而,由于各种人为和自然因素,在现实场景中收集的此类数据往往是…

NUS CS1101S:SICP JavaScript 描述:二、使用数据构建抽象

原文&#xff1a;2 Building Abstractions with Data 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我们现在来到数学抽象的决定性步骤&#xff1a;我们忘记符号代表什么。…[数学家]不需要闲着&#xff1b;他可以用这些符号进行许多操作&#xff0c;而无需看它们所代…

Elasticsearch 7.8.0从入门到精通

安装Elasticsearch 7.8.0 官网&#xff1a;Elasticsearch 7.8.0 | Elastic 大家下载所需要的安装包即可。然后解压缩&#xff1a; Elasticsearch是通过java编写的&#xff0c;所以自带jdk。多好&#xff0c;下载Elasticsearch赠送jdk 0.0&#xff0c;不过一般我们用自己的jdk…

C++学习笔记——输入、输出和文件

目录 一、标准输入输出 2.1下面是它们的基本用法 解释 二、格式化输入输出 2.2下面是一个示例 解释 三、文件读写 3.3下面是一个文件读写的示例 解释 四、异常处理和错误检测 4.1下面是一个示例 解释 五、一个实例代码 5.1如何读取 CSV 文件&#xff0c;并计算每…

QToolBar、QStatusBar和QDockWidget的使用

1. 工具栏 QToolBar 1.1 创建工具栏 1.1.1 工具栏的基本函数 设置工具栏的停靠区域 参数 Qt::LeftToolBarArea //左边 Qt::RightToolBarArea //右边 Qt::TopToolBarArea //顶部 Qt::BottomToolBarArea //底部 Qt::AllToolBarAreas //所有区域 Qt::NoToolBarArea //没有QMa…

基于NLP的恶意网页识别

基于NLP的恶意网页识别 基于NLP的恶意网页识别引言项目目录回顾优化HTML标签提取结果使用预训练模型Fine-tune数据处理和模型训练模型训练与评估模型导出部署与预测总结 基于NLP的恶意网页识别 引言 欢迎阅读《 基于NLP的恶意网页识别》&#xff0c;在前三篇中&#xff0c;我…

如何保证数据库和缓存双写一致性-----一篇足以

保证数据库和缓存双写一致性的必要性和优点在于确保系统数据的准确性和可靠性。通过双写一致性机制&#xff0c;系统可以防止因为缓存数据与数据库数据不一致而导致的业务错误。这种做法有效降低了系统的脆弱性&#xff0c;提高了数据的完整性。同时&#xff0c;通过缓存加速读…

AI智能分析网关V4烟火检测算法解决方案

一、背景需求 根据国家消防救援局公布的数据显示&#xff0c;2023年共接报处置各类警情213.8万起&#xff0c;督促整改风险隐患397万处。火灾危害巨大&#xff0c;必须引起重视。传统靠人工报警的方法存在人员管理难、场地数量多且分散等问题&#xff0c;无法有效发现险情降低…

部署Tomcat及其负载均衡

简介 在前面已经学习了Nginx服务器的安装配置&#xff0c;本章主要采用案例课的形式介绍Tomcat及NginxTomcat负载均衡群集。Tomcat案例首先介绍其应用场景&#xff0c;然后重点介绍Tomcat的安装配置&#xff0c;NginxTomcat负载均衡群集案例是应用于生产环境下的一套可靠的Web站…

牛仔行头目标检测竞赛 李沐老师Kaggle(有代码有注释)

一、比赛地址 CowBoy Outfits Detection | Kaggle 二、数据介绍 这次比赛的数据集一共有4879个image&#xff0c;需要自己划分训练集和验证集。annotation的格式是json&#xff0c;因此如果用yolo系列的算法会涉及到json2txt这一步。当然如果不用yolo系列的就不要这段代码了。…

[vivado ] report_utilization -name

可以Open Synthesiezed或 Implementation 后的Design使用下面的命令&#xff0c;一定要加-name这个option, 后面的utilization_1可以可以自定义。 report_utilization -name utilization_1

【Python机器学习】分类器的不确定估计——预测概率

predict_proba的输出是每个类别的概率&#xff0c;通常比decision_function的输出更容易理解&#xff0c;对于二分类问题&#xff0c;它的形状始终是(n_samples,2)。 import mglearn.tools from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets im…

从DETR到Mask2Former(3):masked attention的attention map可视化

Mask2Former的论文中有这样一张图&#xff0c;表示masked attenion比cross attention效果要好 那么这个attention map是怎么画出来的&#xff1f; 在mask2attention的源代码中 CrossAttentionLayer这个类中&#xff0c;在forward_post函数中做如下修改&#xff1a; def forwar…