数据库 explain 关键字解析

news2024/11/18 12:43:39

目录

1. explain 概述

2. explain 关键字的使用方式

3. explain 的版本迭代

4. explain 只分析SQL语句,不执行SQL语句

5. explain 输出结果中各个字段的含义

6. type 表示检索表数据的方式

7. key_len表示使用的索引的长度

8. rows 表示预估读取到的行数

9. Extra 表示SQL执行时的一些额外信息


1. explain 概述

有些同学可能不知道,我们在数据库中运行 SQL 语句时,底层优化器会选择最优的执行方式来执行我们的 SQL 语句,也就是说,底层执行 SQL 语句的顺序并不一定跟我们写的 SQL 语句的顺序是一致的。MySQL 中有专门优化 SELECT 语句的优化器模块,主要功能是:通过计算分析系统中收集到的统计信息,为客户端请求的 Query(查询) 提供它认为最优的执行计划。

(这里要注意一点,这里最优的执行计划是服务器通过计算得出的,但不见得是我们开发人员认为是最优的,所以实际开发过程中我们的DBA不一定会采用它所提供的执行计划,而是在所提供的执行计划上综合业务逻辑做一些调整)

而通过 explain 关键字就可以让我们知道数据库对 SQL 语句的执行计划是怎么样的,比如多表连接的顺序是什么,执行一条 SQL 语句时,数据库在执行的时候先做什么,再做什么,都可以通过 explain 关键字来查看。explain 语句有很多的输出项,我们就可以通过这些输出项的数据来对 SQL 语句做判断,从而优化那些查询慢的 SQL 语句。

2. explain 关键字的使用方式

explain 关键字的使用方式极其简单,我们只需要将它加在SQL 语句的最前面就可以了,如下所示

# 加在 SELECT 查询语句的前面
EXPLAIN SELECT * FROM t_patent WHERE pid > 115;
# 加在 DELETE 删除语句的前面
EXPLAIN DELETE FROM t_patent WHERE pid = 110;
# 加在 UPDATE 更新语句的前面
EXPLAIN UPDATE t_patent
SET t_patent.patent_name = "张三" WHERE pid = 130;

3. explain 的版本迭代

(1)在 MySQL5.6.3 版本以前,explain 只能分析 SELECT 语句的执行计划,但是在 MySQL5.6.3 版本以后,explain 不仅可以分析 SELECT 语句的执行计划,还可以分析UPDATE,DELETE语句的执行计划,只是我们更多的是用于分析 SELECT 查询语句,这一点作为了解即可;

(2)在 MySQL5.7 以前的版本中,想要显示 partitions 需要使用 explain partitions 命令,想要显示 filtered 需要使用 explain extended 命令。而 5.7 版本之后,默认 explain 将直接显示 partitions 和 filtered 中的信息。也许现在有些同学还不 partitions 和 filtered 是什么,这里先不用关心,看到下面的讲解自然就会明白了。这里你先可以简单理解为,在 5.7 版本之后,explain 关键字做了增强,explain 将另外两个关键字的功能也包含进去了,不需要再像以前一样执行三个关键字。

4. explain 只分析SQL语句,不执行SQL语句

这句话应该很好理解,我们使用 explain 关键字执行一条语句时,它只是输出当前 SQL 语句最优的执行计划,但并没有真正的去执行这条 SQL 语句。

我简单举个例子演示一下

(1)如下为 patent 数据库中的 t_patent 表,表中有一些数据

(2)然后,我使用 explain 关键字查询输出当前 DELETE 语句的执行计划,运行成功输出了结果,这里暂时不关心结果中的各个字段含义是什么

(3)我们再来查询一下刚才 pid = 110 的那条数据是否存在,如下,我们发现仍然可以查询到 pid = 110 的这条数据。

通过这个例子也证实了刚才的结论,explain 只负责输出最优的执行计划,但并没有真正的去执行 SQL 语句。

5. explain 输出结果中各个字段的含义

刚才在第四小节的演示中,我们看到了执行 explain 会输出很多的字段,一共有12个,每个字段代表了不同的涵义,列举如下

在这12个字段中,我们需要重点关注 type,key_len,rows,Extra 这个四个字段,他们是面试过程中最容易问到的点,而且是SQL语句调优的关键点,我们的 SQL 的调优就是基于这个四个关键字段来调的。

6. type 表示检索表数据的方式

执行计划中的 type 的一条记录就代表 MySQL 对某个表执行查询时的访问方式,也称"访问类型"。它有众多访问方式,查询的效率从高到低依次是

system > const > eq > ref > fulltext > ref or null > range > index > ALL

在实际开发过程中,我们希望一条 SQL 语句的查询效率越高越好,大多数情况下应当把访问方式至少定位在 "range" 以上,ALL(全表扫描)是我们最不希望看到的结果,所以在编写 SQL 时要尽量避免此访问类型的发生。

7. key_len表示使用的索引的长度

key_len 通常应用于联合索引,开发过程中,一个表会有很多的字段,为了提高查询效率,我们会为查询频率较高的几个字段建立联合索引,通过 explain 就可以得到使用而索引字段的长度,从而得知当前SQL语句中都是用到了联合索引中的那个字段,以便做进一步的优化。

不同的类型的字段计算规则也不一样,如下所示

(1)字符串类型计算

char(n):算作 n 个字节;

varchar:如果是 utf-8 则算作 3n+2 个字节,如果是utf-mb4,则算作 4n+2 个字节;

(2)数值类型计算

tinyint:1字节;

smaillint:2字节;

int:4字节;

bigint:8字节;

(3)事件类型计算

date:3字节;

timestamp:4字节;

datetime:8字节;

此外,字段如果为空,需要1个字段记录是否为空。

通过 explain 得出的索引时应长度,配合上述三种类型长度的计算,我们就能精准得出联合索引中的那些字段被使用到,那些没有被使用到,可以进一步优化sql语句的编写,提高程序运行效率。

8. rows 表示预估读取到的行数

rows 字段的值通常可以搭配 filtered 字段的值,rows 表示预估会读取到的行数,filtered 则表示经过条件筛选之后剩余记录条数的百分比,而两者想成得出的结果通常就是我们最终查询所得到的数据行数。

9. Extra 表示SQL执行时的一些额外信息

这里的额外信息包含很多种,如下

(1)Using Index:使用非主键索引数就可以查询到所需要的数据,一般是覆盖索引,即想要查询的数据都包含在非剧组索引数中,不需要进行回表操作。

(2)Using where:不通过索引查询所需要的数据,这句话也很好理解,就是我们 where 筛选条件的字段不是索引字段。那么就会进行全表扫描,即 type 字段值为 ALL。

(3)Using index condition:表示查询列不被索引覆盖,where 条件中是一个索引范围查找,过滤玩索引后会回表找到所有符合条件的数据行。例如 SELECT * FROM table where 主键 > 某个值,这种 SQL 语句就符合上面这种情况,

(4)Using temporary:表示在查询的过程中需要利用临时表来处理查询,比如我们使用 union all 取两个表满足条件的并集,得到的数据表实际上是一张临时表;

(5)Using filesort:当查询中包含 order by 操作而且无法利用索引完成的排序操作时,若数据量小就在内存中进行排序,若数据量多就在硬盘中进行排序。

当遇到 Using temporary 或 Using filesort 时,我们可以通过添加索引对 SQL 进行优化。

(6)Select table optimized away:当我们通过聚合函数访问某些索引数据时,在 Extra 中就会显示 Select table optimized away,如果通过聚合函数访问普通非索引字段,在 Extra 中就会显示 null。 

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

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

相关文章

2023年10月9日历史上的今天大事件早读

1740年10月09日红溪惨案 1874年10月09日万国邮政联盟成立 1912年10月09日第一次巴尔干战争爆发 1913年10月09日武昌起义元勋蒋翊武被害 1924年10月09日近代翻译家林纾(林琴南)逝世 1934年10月09日南斯拉夫国王遇刺身亡 1936年10月09日红军三大主力会师 1941年10月09日第…

瑜伽馆微信小程序怎么制作约课系统

在瑜伽馆微信小程序中,约课系统是一个重要的功能模块,可以帮助用户便捷地预约和取消预约瑜伽课程。下面将介绍如何制作一个约课系统,让瑜伽馆微信小程序更加完善。 一、确定约课系统的功能 在制作约课系统前,需要明确其功能和特点…

基于Python+Selenium的web自动化测试框架详解

简介 随着Web应用程序的广泛应用和不断发展,Web自动化测试已经成为软件质量保证中的一个重要环节。而PythonSelenium作为一组强大的工具和框架,已经成为Web自动化测试领域中的热门技术之一。PythonSelenium可以帮助我们快速、准确地模拟用户行为和操作&…

Airtest自动化测试工具

一开始知道Airtest大概是在年初的时候,当时,看了一下官方的文档,大概是类似Sikuli的一个工具,主要用来做游戏自动化的,通过截图的方式用来解决游戏自动化测试的难题。最近,移动端测试的同事尝试用它的poco库…

彩虹商城全新SUP模板 知识付费模板 卡卡云模板源码

2023彩虹商城全新SUP模板 | 知识付费模板 | 卡卡云模板源码 图片:

如何更好的使用结构化工艺文件编制软件?——青创智通

青创智通结构化工艺文件编制软件包括文件创建、文件编制、文件修改、文件复制、文件引用、标准文件库、工艺路线、工艺资源库管理、审批管理、文件导出、文件清单汇总、接口管理等功能。具有以下优势及亮点。 1.集中工艺数据管理 以PLM系统平台为核心的结构化工艺数据支撑平台…

动画圆圈文字标志效果

效果展示 CSS 知识点 实现圆圈文字animation 属性回顾 实现思路 从效果的实现思路很简单,其实就是两个圆圈就可以实现。外层大圆(灰色)用于圆圈文字的展示,而内圆(藏青色)主要用于存放 Logo 图片。布局采…

万兆光模块的速度到底有多快?

万兆光模块的速度到底有多快?相信这是很多人都想知道的问题。首先,让我们来了解一下万兆光模块的工作原理。万兆光模块是一种高速率的光电转换模块,发送端把电信号转换成光信号,通过光纤传送后,接收端再把光信号转换成…

php+html+js+ajax实现文件上传

phphtmljsajax实现文件上传 目录 一、表单单文件上传 1、上传页面 2、接受文件上传php 二、表单多文件上传 1、上传页面 2、接受文件上传php 三、表单异步xhr文件上传 1、上传页面 2、接受文件上传php 四、表单异步ajax文件上传 1、上传页面 2、接受文件上传ph…

Scala第二十章节

Scala第二十章节 scala总目录 文档资料下载 章节目标 理解Akka并发编程框架简介掌握Akka入门案例掌握Akka定时任务代码实现掌握两个进程间通信的案例掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事…

彻底关闭Win10/Win11关闭自动更新

在自己电脑上发现可以关闭win11系统自动更新,以后效果就不知道了 1.在开始菜单搜索框输入“注册表编辑器”并打开,如图所示 2.在注册表上方输入一下路径,如图所示 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings …

SAP FI BSEG-VBUND 贸易伙伴在过账中使用

主要的配置是在OBA7 主要是通过公司间记账&输入贸易伙伴来控制 第一种情况,两者都不勾选 如果在总账行项目,客户,供应商主记录中维护了贸易伙伴,贸易伙伴会被带入到所有的各自的行项目里面 第二种情况,公司间记账…

全网最细,真实企业性能测试落地实施,一文带你快速打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、什么是性能测试…

墨西哥专线适合企业大批量寄送吗?

随着全球经济一体化的发展,企业间的交流与合作日益密切。跨境物流服务作为企业开展国际贸易的重要基础设施,其重要性不言而喻。墨西哥专线作为一种高效、快速的跨境物流解决方案,受到了越来越多企业的关注。那么,墨西哥专线是否适…

软件测试面试必问:为什么要选择软件测试?

经常会遇到一些面试官没事的时候问,为什么选择软件测试? 我都在这个行业,你怎么还问我为什么选择软件测试? 错误回答一:我觉得软件测试收入较高。 我们都知道软件测试收入是很高,但是这也不是你面试回答的点…

MATLAB导入EXCEL数据做曲线拟合

MATLAB导入EXCEL数据做曲线拟合 导入数据 导入的EXCEL格式为如下,有一列模拟数据和对应的实测数据 打开之后改个名,方便后续处理导入之和关掉该页面,可以看到已经生成了一个表格数据 然后新建变量 将该列数据复制到fanyan变量中&#x…

如何列出 Ubuntu 和 Debian 上已安装的软件包

当你安装了 Ubuntu 并想好好用一用。但在将来某个时候,你肯定会遇到忘记曾经安装了那些软件包。 这个是完全正常。没有人要求你把系统里所有已安装的软件包都记住。但是问题是,如何才能知道已经安装了哪些软件包?如何查看安装过的软件包呢&a…

智慧工地:数字革命下的建筑业新趋势

在当今建筑领域,智慧工地正迅速崭露头角。这个概念不仅代表了技术进步,还预示着建筑行业的数字化和智能化未来。从多个角度来看,智慧工地都具有深远的意义,它正在改变着我们建筑的方式和未来。 提高工程效率 智慧工地利用物联网&…

FP-Growth算法全解析:理论基础与实战指导

目录 一、简介什么是频繁项集?什么是关联规则挖掘?FP-Growth算法与传统方法的对比Apriori算法Eclat算法 FP树:心脏部分 二、算法原理FP树的结构构建FP树第一步:扫描数据库并排序第二步:构建树 挖掘频繁项集优化&#x…

Android:自定义列表弹窗的单选图标样式、去掉列表弹窗的上下提示线

正常声明一个单选列表弹窗,如下代码: AlertDialog.Builder builder new AlertDialog.Builder(this, R.style.Theme_AlertDialog_Base);String []items {"1111111","2222222","3333333","4444444","5555…