当前位置: 首页 > 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…...

Simulink双矢量MPC实战:从郭磊磊论文到可运行的Matlab Function代码(调制模型预测控制详解)

Simulink双矢量MPC实战:从理论到代码的完整实现路径 当我在实验室第一次尝试复现郭磊磊老师那篇经典论文时,面对12种矢量组合和复杂的PWM生成逻辑,完全不知从何下手。经过三个月的反复试验和代码调试,终于摸清了从论文公式到可运行…...

SEO_10个提升网站排名的实用SEO技巧分享(370 )

SEO:10个提升网站排名的实用SEO技巧分享 在当今的互联网时代,一个网站的成功离不开搜索引擎优化(SEO)。SEO不仅仅是一套技术,更是一种思维方式。本文将详细分享十个实用的SEO技巧,帮助你提升网站的排名,吸…...

若依管理系统实战:基于Vuex的用户角色权限与动态菜单路由解析

1. 若依管理系统权限控制核心逻辑解析 若依管理系统作为一款基于SpringBoot和Vue的企业级中后台解决方案,其权限控制体系设计得非常精巧。我在实际项目中使用这套方案时,发现它通过前后端协同工作,实现了细粒度的权限管理。整个流程可以概括为…...

fSpy完全上手指南:从基础到实战的零门槛教程

fSpy完全上手指南:从基础到实战的零门槛教程 【免费下载链接】fSpy A cross platform app for quick and easy still image camera matching 项目地址: https://gitcode.com/gh_mirrors/fs/fSpy 当你需要将一张普通的2D照片转换为精确的3D场景时,…...

Visual C++组件维护完全指南:从问题诊断到系统优化

Visual C组件维护完全指南:从问题诊断到系统优化 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C组件维护是Windows系统稳定运行的关键环节&…...

m4s-converter:重构B站缓存管理的格式转换解决方案

m4s-converter:重构B站缓存管理的格式转换解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一款开源工具&…...

微信好友检测神器:一键识别谁删了你,轻松管理社交圈

微信好友检测神器:一键识别谁删了你,轻松管理社交圈 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFr…...

一键捕获完整网页:Full Page Screen Capture 高效解决方案

一键捕获完整网页:Full Page Screen Capture 高效解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-e…...

从Simulink到实物:单闭环直流调速仿真如何指导真实的Arduino/STM32控制?

从Simulink到Arduino:如何将直流电机控制算法从仿真落地到真实硬件 当你第一次在Simulink中看到那个完美的电机转速响应曲线时,那种成就感是无可替代的。但很快,一个更迫切的问题出现了:这些漂亮的仿真结果,如何变成手…...

Phi-3 Forest Laboratory操作系统知识问答系统:从进程管理到文件系统详解

Phi-3 Forest Laboratory操作系统知识问答系统:从进程管理到文件系统详解 你有没有过这样的经历?翻开一本厚厚的操作系统教材,满篇都是“进程调度算法”、“虚拟内存”、“文件系统结构”这些抽象概念,看得人头晕眼花。或者&…...