上手SQL语句调优必须了解的内容——Explain

news2024/11/24 19:09:42

在做性能测试时,资深的性能测试工程师,都会帮助研发同学优化sql语句,听起来很高深,但是具体操作是比较容易的,使用expain命令就可以了!本文我会用最简单有效的方式带大家掌握expain的使用方法!

Explain概述

explain即执行计划,使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。

使用起来非常简单,在你的sql语句前面加explain就可以了

-- 实际SQL,查找用户名为kevin的员工

select * from USER where name = 'kevin';

-- 查看SQL是否使用索引,前面加上explain即可

explain select * from USER where name = 'kevin';

在sqlyog中,显示效果如下:

接下来具体讲解上图中各个参数的含义,给大家一张图来有个概括的认识

Explain字段含义

type(重要)

其中最重要的是type列,我们通常通过该列来判断sql语句是否走了索引,索引是否有效是sql调优非常重要的知识点

type说明表的访问方式,表示MySQL在表中找到所需行的方式,又称访问类型

常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)具体

  • "ALL"表示全表扫描,没有使用索引。
  • "index"表示使用了索引,但不是覆盖索引(即查询中使用了索引,但还需要回表获取数据)。
  • "range"表示使用了覆盖索引(即查询中直接从索引中获取了所需数据,无需回表)。
  • "ref"表示使用了索引(可能是覆盖索引或非覆盖索引),并使用了一个或多个列进行比较。
  • "eq_ref"表示使用了唯一索引,并且只使用了等于操作符进行比较。

key_len(重要)

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)不损失精确性的情况下,长度越短越好 

select_type

 查询中每个select子句的类型

(1) SIMPLE(简单SELECT,不使用UNION或子查询等)

(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

(3) UNION(UNION中的第二个或后面的SELECT语句)

(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)

(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)

(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)

(8) DERIVED(派生表的SELECT, FROM子句的子查询)

(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

Key

key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中。如果没有选择索引,键是NULL。

ref

这一列显示了在 key 列记录的索引中,表查找值所用到的列或常量,常见的有:const、func、NULL、字段名。

 rows

 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

Extra

extra常用值包括以下几种:

  1. "Using temporary": 当查询需要使用临时表来存储中间结果时,会出现此值。这通常发生在排序、分组或连接操作中。临时表在查询执行期间被创建,并用于存储中间结果,以支持查询的执行。
  2. "Using filesort": 当查询需要对结果进行外部排序时,会出现此值。这意味着查询的结果集不能在内存中排序,而是需要使用文件系统进行排序。外部排序对于大型数据集是必要的,但可能会导致性能下降。
  3. "Using index": 此值表示查询使用了覆盖索引(Covering Index)来检索数据。覆盖索引是指索引本身包含了所有查询所需的数据,而不需要回表检索实际的数据行。使用覆盖索引可以减少磁盘I/O操作,提高查询性能。
  4. "Using intersection": 当查询使用了集合操作(如交集)时,会出现此值。这意味着查询使用了某种集合操作来合并多个表或子查询的结果。
  5. "Using union": 当查询使用了集合联合操作时,会出现此值。这意味着查询使用了某种联合操作来合并多个表或子查询的结果。
  6. "Using sort_union": 当查询使用了排序联合操作时,会出现此值。这意味着查询使用了排序联合操作来合并多个表或子查询的结果,并按照指定的排序顺序对结果进行排序。
  7. "Using merge join": 当查询使用了合并连接(Merge Join)操作时,会出现此值。合并连接是一种特殊的连接操作,用于将两个有序的数据集合并在一起。

温馨提示

EXPLAIN不分析关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

EXPALIN中部分统计信息是估算的,并非精确值
EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划

我的每一篇文章都希望帮助读者解决实际工作中遇到的问题!如果文章帮到了您,劳烦点赞、收藏、转发!您的鼓励是我不断更新文章最大的动力!

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

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

相关文章

JVM虚拟机:垃圾回收器之Serial(年轻代)

本文重点 本文将介绍年轻代的Serial回收器,它最主要的特征就是串行化的回收器。 运行方式 Serial是一个单线程的收集器,在进行垃圾收集的时候,必须暂停其它所有的工作线程(java程序找一个安全点safe point然后才停止执行,进行等待)直到垃圾回收结束,下的运行状态图如…

迅为iTOP-i.MX8M开发板使用 make 工具

make 工具是编译辅助工具,用来解决使用命令编译工程非常繁琐的问题。 调用这个命令工具:我们在 windows 上编程使用 ide ,我们有图形界面,有相应的按钮,比如说 build 或者 run 来编译。其实 make 这个编译辅助工具使…

Dajngo学习笔记(3)

电话号码管理 查看功能 class PrettyNum(models.Model):mobilemodels.CharField(verbose_name"电话号",max_length11)pricemodels.IntegerField(verbose_name"价格")level_choice((1,"一级"),(2,"二级"),(3,"三级"))level…

RISC-V处理器设计(四)—— Verilog 代码设计

一、前言 从6月底刚开始接触 risc-v 架构,到现在完成了一个 risc-v cpu 的设计,并且成功移植了 rt-thread nano 到本 cpu 上运行,中间经过了 4个多月的时间,遇到了数不清的问题,也想过放弃,但好在最后还是…

美国阿贡国家实验室发布快速自动扫描套件 FAST,助力显微技术「快速阅读」成为可能

「我高兴地在北京市的天安门广场上看红色的国旗升起」 快速阅读一下这个句子,大家可能会发现,只需「我在天安门广场看升旗」几个字,就能概述我们需要的信息,也就是说,无需逐字逐句地阅读,抓住重点即可破译…

【flutter no devices】

1.在环境变量增加 ANDROID_HOME 值为:C:\Users\Administrator\AppData\Local\Android\Sdk (Android sdk 位置) 2 环境变量的path里面增加2个值: %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools 3 打开cmd,或者在Android st…

嵌入式Linux和stm32区别? 之间有什么关系吗?

嵌入式Linux和stm32区别? 之间有什么关系吗? 主要体现在以下几个方面: 1.硬件资源不同 单片机一般是芯片内部集成flash、ram,ARM一般是CPU,配合外部的flash、ram、sd卡存储器使用。最近很多小伙伴找我,说想要一些嵌…

【滑动窗口】篮里到底能装 “几个水果” 呢?

Problem: 904. 水果成篮 文章目录 题目分析算法原理分析暴力枚举 哈希表滑动窗口优化数组再度优化 复杂度Code 题目分析 首先我们来分析一下本题的思路 首先我们通过题目的描述来理解一下其要表达的含义,题目给到我们一个fruit数组,里面存放的是每棵树上…

Linux Vim批量注释和自定义注释

使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。连续行的注释其实可以用替换命令来完成。 换句话说,在指定…

推特被封号怎么办?如何防封?

今年社交媒体巨头Twitter正式更名与标示为“X”,这一举措引发了广泛关注和讨论。马斯克称,此举是为了将推特重塑为一个广泛的通信和金融交易平台,打造一个像“微信”一样的万能应用程序,也就是“X”,并承诺推特将迅速进…

外汇天眼:全员免费,赢奖金!

外汇市场一直以来都是金融投资者的热门领域之一,但对于新手来说,了解和掌握外汇交易可能需要时间和经验。为了帮助新手入门,提高交易技能,外汇模拟交易应运而生。为的是能够零风险无压力地帮助外汇投资者更好地掌握外汇交易的技巧…

SonarQube的使用心得

一、使用背景: SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量。 通过插件形式,可以支持包括 java, C#, C/C, PL/SQL, Cobol, JavaScrip, Groovy 等等二十几种编程语言的代码质量管理与检测。 Sonar可以从以下七个维度…

给定n个点或一个凸边形,求其最小外接矩形,可视化

这里写目录标题 原理代码 原理 求n个点的最小外接矩形问题可以等价为先求这n个点的凸包,再求这个凸包的最小外接矩形。 其中求凸包可以使用Graham-Scan算法 需要注意的是, 因为Graham-Scan算法要求我们从先找到凸包上的一个点,所以我们可以先…

CRM 报告:跟踪销售业绩的强大工具

对于希望保持良好客户关系的企业来说,CRM(客户关系管理)报告是不可或缺的。它使企业能够跟踪客户互动,并利用这些数据改善客户服务。 需要注意的是,CRM 报告不是一次性的,而是一个持续的过程。这是因为客户…

Webpack介绍大全

Webpack 一 、什么是webpack WebPack是一个现代JS应用程序的静态模块打包器(module bundler) 模块(模块化开发,可以提高开发效率,避免重复造轮子) 打包(将各个模块,按照一定的规则…

“第六十二天”

新东西 %[^\n] 这个题测试的时候不知道哪里为什么一直错一个。 int main() {char a[81] { 0 };fgets(a, 80, stdin);int i 0;int n strlen(a);for(i0;i<n;i){if ((a[i] > a && a[i] < y) || (a[i] > A && a[i] < Y))a[i] 1;else if (a[i…

中介模式(Mediator)

简介 当各个模块的调用变得错综复杂时&#xff0c;可以使用中介模式&#xff0c;用一个中介对象完成对象交互&#xff0c;各个对象不需要显示的相互引用。 创建一个中介对象完成所有的调用&#xff1a;Mediator->A ,Mediator->B,Mediator->C,Mediator->D&#xf…

设计模式—结构型模式之桥接模式

设计模式—结构型模式之桥接模式 将抽象与实现解耦&#xff0c;使两者都可以独立变化。 在现实生活中&#xff0c;某些类具有两个或多个维度的变化&#xff0c;如图形既可按形状分&#xff0c;又可按颜色分。如何设计类似于 Photoshop 这样的软件&#xff0c;能画不同形状和不…

gcov c++代码覆盖率测试工具(原理篇)

一、gcov简单介绍 Gcov是一个测试C/C代码覆盖率的工具&#xff0c;伴随GCC发布&#xff0c;配合GCC共同实现对C/C文件的语句覆盖、功能函数覆盖和分支覆盖测试。 二、gcov统计生成覆盖率流程 图1 gcov覆盖率生成过程 Gcc在编译阶段指定 –ftest-coverage 等覆盖率测试选项后…

8-2、T型加减速计算简化【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍简化T型加减速计算过程&#xff0c;使其适用于单片机数据处理。简化内容包括浮点数转整型数计算、加减速对称处理、预处理计算 一、浮点数转整型数计算 1.1简化∆t_1计算 根据上一节内容已知 K0.676 step1.8/X&#xff08;x为细分值&#xff0c;1.8对…