【MySQL数据库 | 第二十篇】explain执行计划

目录
前言:
explain:
语法:
总结:
前言:
上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具:SQL执行频率,慢日志查询,profile。但是这三个方法也只是在时间角度粗略的查看SQL语句效率,我们要想看一个语句的真正性能,还要借助explain来查看SQL语句的优劣。
explain:
在 SQL 中,EXPLAIN 获取MySQL如何执行SELECT语句的信息,包括在SELECT语句的执行过程中表如何连接和连接的顺序。
EXPLAIN 命令会模拟查询执行过程,而不执行查询本身,从而解释查询的执行计划方式以及使用的索引,有助于检查查询是否使用有效的索引,以及需要进行优化的部分。
具体而言,EXPLAIN 会生成一个表格,其中包含了查询语句的各个部分对应的执行计划,包括查询类型、表扫描方式、索引使用情况等等。这个表格中的每一行对应查询过程中的一个步骤,而每一列则描述该步骤或该查询语句的其他相关信息。
通过使用 EXPLAIN 命令,开发人员可以更好地了解查询优化器的使用,确定查询中的性能问题并尝试通过调整查询语句、索引等来解决这些问题。
语法:
#直接在SELECT语句之前加上关键字explain
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;
我们在自建的表中使用一下这条语句:
EXPLAIN SELECT * FROM emp WHERE age BETWEEN 18 AND 30;
可以看到执行结果为:

我们逐一介绍这些都代表什么:
1.id:slesct查询的序列号,表示查询中执行select子句或者是顺序表的操作(id相同,执行顺序从上到下,id不同,值越大,越先执行)
2. select_type: 这个字段用于指示 MySQL 执行查询的类型
- SIMPLE:简单查询,不包含 UNION 查询或子查询等。
- PRIMARY:表示查询语句中最外层查询。
- DEPENDENT SUBQUERY:依赖外部查询中的结果。
- UNION:在 UNION 中的第二个或后续 SELECT 语句。
- UNION RESULT:从 UNION 查询的结果中选择行。
- SUBQUERY:在 WHERE 子句或 HAVING 子句中的子查询。
- DERIVED:为 FROM 子句中的表或子查询派生临时表,并用该表返回结果。
- MATERIALIZED:派生临时表已存在,查询需要检索它的结果。
在给定的执行计划中,`select_type` 的值是 `SIMPLE`,这意味着查询是一个简单的查询,没有使用 UNION 查询或子查询等复杂特性。
3.type:指出查询语句所涉及的表名以及使用的访问方式。
所有的访问方式:
- system:系统表中仅有一行的表(例如 `dual` 等),这是`const` 类型的特例,一般不需要考虑该访问方式。
- const:表示查询使用常数来匹配,只有一行数据满足条件。这种情况一般出现在使用主键或唯一索引进行查询的情况下。
- eq_ref:使用的是唯一索引或主键来查询,查询的就是匹配的一行数据。
- ref:查询使用非唯一索引,返回的结果集会处理一部分索引,需要回到数据表中进行匹配查询条件的数据。
- range:使用一个 {@link https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html | 索引范围查找}。
- index:表示查询会全索引扫描,并不需要回到数据表中进行数据查询。
- ALL:表示全表扫描,对于大表而言,这是一种相对来说较低效的查询方式。
这些访问方式会影响到 MySQL 数据库的查询效率,因此在开发中应该灵活根据具体情况来选择选择适合的查询方式。例如,对于大表而言,应该尽可能地使用索引进行查询,避免使用 `ALL` 等类型。
这些类型的性能从高到低分别为:NULL,system,const,eq_ref,ref,range,index,all.
但实际上我们查询不会出现NULL的访问方式,因为NULL不表示本次查询没有用到任何表,实际中我们再怎么优化也不可能优化NULL。
4.possible_keys:表示可以在该查询中使用的索引。
5.key:实际使用的索引。
6.key_len:表示 MySQL 所使用的索引的长度。
7.ref:表示 MySQL 所使用的索引与表之间的关联条件。
8.rows:表示 MySQL 在执行查询时扫描的行数。
9. filtered:表示结果集的行数与扫描的行数之间的比率。
10. Extra:表示额外的执行计划细节。在本例中使用了 Using where,表示该查询使用了 WHERE 条件。
这里因为上面演示的时候使用的是单表查询,因此只有一个select语句,无法看出id的效果,因此我们在这里调用一下多表查询
explain select e.*, d.name from emp e left join dept d on e.dept_id = d.id;
运行结果:

我们在这里可以发现:id并不是自增的,这也就是我们之前提到的
id是slesct查询的序列号,表示查询中执行select子句或者是顺序表的操作(id相同,执行顺序从上到下,id不同,值越大,越先执行)
如果id不同的情况呢?
explain select * from emp where dept_id = (select id from dept where name = '销售部');
运行结果:

我们可以看到在这个情况下id就体现了执行顺序,我们可以知道在这个多表查询中,我们是先在demp表中执行select语句,然后在emp表中执行select语句。
总结:
本文介绍了更加实用的效率查看工具explain,以及他的各种用法,大家要熟练掌握我们目前已经介绍的这四个语句优劣查看工具,这样才可以玩转MySQL的优化。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关文章:
【MySQL数据库 | 第二十篇】explain执行计划
目录 前言: explain: 语法: 总结: 前言: 上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具:SQL执行频率,慢日志查询,profile。但是这三个方法也只是在时间角度粗略的…...
学Python能做哪些副业?我一般不告诉别人!建议存好
前两天一个朋友找到我吐槽,说工资一发交完房租水电,啥也不剩,搞不懂朋友圈里那些天天吃喝玩乐的同龄人钱都是哪来的?确实如此,刚毕业的大学生工资起薪都很低,在高消费、高租金的城市,别说存钱&a…...
简化 Hello World:Java 新写法要来了
OpenJDK 的 JEP 445 提案正在努力简化 Java 的入门难度。 这个提案主要是引入 “灵活的 Main 方法和匿名 Main 类” ,希望 Java 的学习过程能更平滑,让学生和初学者能更好地接受 Java 。 提案的作者 Ron Pressler 解释:现在的 Java 语言非常…...
【服务器】springboot实现HTTP服务监听
文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…...
浅谈常见的加密算法及实现
浅谈常见的加密算法及实现 简介: 随着公司业务的发展,系统用户量日益增多,系统安全性问题一直在脑子里反复回旋,以前系统用户少影响面小,安全方面也一直没有进行思考和加固,现如今业务发展了,虽…...
FTP协议详解
简介 FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协…...
网络安全|渗透测试入门学习,从零基础入门到精通—渗透中的开发语言
目录 前面的话 开发语言 1、html 解析 2、JavaScript 用法 3、JAVA 特性 4、PHP 作用 PHP 能做什么? 5、C/C 使用 如何学习 前面的话 关于在渗透中需要学习的语言第一点个人认为就是可以打一下HTML,JS那些基础知识,磨刀不误砍柴…...
八大排序算法之归并排序(递归实现+非递归实现)
目录 一.归并排序的基本思想 归并排序算法思想(排升序为例) 二.两个有序子序列(同一个数组中)的归并(排升序) 两个有序序列归并操作代码: 三.归并排序的递归实现 递归归并排序的实现:(后序遍历递归) 递归函数抽象分析: 四.非递归归并排序的实现 1.非递归归并排序算法…...
基于SpringBoot+Html的前后端分离的学习平台
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 在知识大爆炸的现代,怎…...
MySQL实战解析底层---“order by“是怎么工作的
目录 前言 全字段排序 rowid排序 全字段排序 VS rowid排序 前言 在开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求以举例市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓…...
Linux和Shell:开源力量与命令行之美
目录 一、概述二、Linux的简单介绍三、Shell的简单介绍四、Linux和Shell的应用领域五、Shell编程结语: 一、概述 Linux和Shell是开源世界中不可或缺的两个重要组成部分。Linux作为一种自由和开放的操作系统,以其稳定性、安全性和可定制性而备受推崇。而S…...
服务负载均衡Ribbon
服务负载均衡Ribbon Ribbon 介绍Ribbon 案例Ribbon 负载均衡策略Ribbon 负载均衡算法设置自定义负载均衡算法 Ribbon 介绍 Ribbon 是一个的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署…...
hibernate vilidator主要使用注解的方式对bean进行校验
hibernate vilidator主要使用注解的方式对bean进行校验,初步的例子如下所示: package com.learn.validate.domain; import javax.validation.constraints.Min; import org.hibernate.validator.constraints.NotBlank; public class Student { //在需要校…...
华为HCIP第一天---------RSTP
一、介绍 1、以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路,但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表震荡等问题,导致用户通信质量差,甚至通信中断。为了解决交换网…...
Jmeter(二) - 从入门到精通 - 创建测试计划(Test Plan)(详解教程)
1.简介 上一篇文章已经教你把JMeter的测试环境搭建起来了,那么这一篇我们就将JMeter启动起来,一睹其芳容,首先我给大家介绍一下如何来创建一个测试计划(Test Plan)。 2.创建一个测试计划(Test Plan&#x…...
Autosar诊断实战系列06-详解Dem中Event的NvM存储
本文框架 前言1. Dem触发NvM存储的基本流程2. Dem触发NvM存储的layout格式及内容2.1 Event在NvM中的layout格式2.2 Event在NvM中的存储内容2.3 Dem中Event与DTC的存储关系3.组合式Event(多个Event对应一个DTC)的存储处理3.1 仅分配一个Memory Entry3.2 检索方式3.3 一对一方式前…...
04 todoList案例
React全家桶 一、案例- TODO List 综合案例 功能描述 动态显示初始列表添加一个 todo删除一个 todo反选一个 todotodo 的全部数量和完成数量全选/全不选 todo删除完成的 todo 1.1 静态组件构建 将资料包中的todos_page/index.html中核心代码添加到Todo.jsx文件中,…...
海睿思分享 | 浅谈企业数据质量问题
一、数据质量问题场景 在日常工作中,业务领导经常通过BI系统来了解各项业务的业绩情况。倘若某天,他打开某张核心报表,发现当日某个区域的数据一直是空白的。BI开发人员经过几个小时的排查分析,发现是当日该区域的销售数据存在产…...
神经网络:激活函数
在计算机视觉中,激活函数是神经网络中的一种非线性函数,用于引入非线性变换和非线性特性到网络中。激活函数的作用、原理和意义如下: 1. 引入非线性变换: 神经网络的线性组合层(如卷积层和全连接层)只能表…...
图像色彩增强相关论文阅读-Representative Color Transform for Image Enhancement(ICCV2021)
文章目录 Representative Color Transform for Image EnhancementAbstractIntroductionRelated workMethod实验Conclusion Representative Color Transform for Image Enhancement 作者:Hanul Kim1, Su-Min Choi2, Chang-Su Kim3, Yeong Jun Koh 单位:S…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
