当前位置: 首页 > news >正文

【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…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...