mysql面试(六)

前言

本章节详细讲解了一下mysql执行计划相关的属性释义,以及不同sql所出现的不同效果

执行计划

一条查询语句经过mysql查询优化器的各种基于成本和各种规则优化之后,会生成一个所谓的
执行计划,这个执行计划展示了这条查询语句具体查询方式。我们可以通过在查询语句之前放一个explain命令来获取这些执行计划信息,比如多表连接的顺序是什么,每个表用什么方式查询,用到哪些索引,从多少条数据中筛选等等信息。
如图:
在这里插入图片描述

输出的这些内容就是执行计划,每个字段代表了不同的信息,下面是这各个字段所标识的不同信息
id: 在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的 id
select_type: SELECT 关键字对应的那个查询的类型
table: 表名
partitions: 匹配的分区信息
type: 针对单表的访问方法
possible_keys:可能用到的索引
key: 实际上使用的索引
key_len: 实际使用到的索引长度
ref: 当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows: 预估的需要读取的记录条数
filtered: 某个表经过搜索条件过滤后剩余记录条数的百分比
Extra: 一些额外的信息
下面我们来详解一下每个字段的具体信息

id

一般是和sql语句中的select对应的,有多少个select,一般情况就会有几个id。看下图,虽然是查询两张表,但其实是同一个select,所以id都是一。相同的情况还有join连接查询。
在这里插入图片描述
但是嵌套查询的时候,查询优化器可能会进行重写,自动转换为连接查询,最终也是用同一个查询。
如图:
在这里插入图片描述
还有一种情况是union连接查询,这种比较特殊,会出现三条数据。这是因为除了把两个表的数据查询出来,还需要创建一个临时表来合并数据返回用户,但是由于合并后不会执行多余的动作,所以他的id也是空的。
如图:
在这里插入图片描述

select_type

由于一个查询语句中,不止有一个select关键字,而每个关键字又代表这一个查询语句,每个查询语句中都可能会查询多个表,每个表都要输出一条查询记录,但是对于同一个select关键字中的表来说,id是相同的。
那mysql为每个select关键字代表的查语句定义了一种属性,不同的查询方式使用不同的属性定义。如下:

  • SIMPLE:Simple SELECT (not using UNION or subqueries) 查询语句中不包含 UNION 或者子查询的查询都算作是 SIMPLE 类型,join连接查询也是这种 SIMPLE 类型
  • PRIMARY:对于包含 UNION 、 UNION ALL 或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的 select_type 值就是 PRIMARY。对比上面union查询的图
  • UNION:对于包含 UNION 或者 UNION ALL 的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的 select_type 值就是 UNION
  • UNION RESULT:MySQL 选择使用临时表来完成 UNION 查询的去重工作,针对该临时表的查询的 select_type 就是 UNION RESULT ,例子上边有
  • SUBQUERY:如果包含子查询的查询语句不能够转为对应的 semi-join 的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询时,该子查询的第一个 SELECT 关键字代表的那个查询的 select_type 就是 SUBQUERY 如图:

在这里插入图片描述

  • DEPENDENT SUBQUERY:如果包含子查询的查询语句不能够转为对应的 semi-join 的形式,并且该子查询是相关子查询,则该子查询的第一个 SELECT 关键字代表的那个查询的 select_type 就是 DEPENDENT SUBQUERY。如图:

在这里插入图片描述

  • DEPENDENT UNION:在包含 UNION 或者 UNION ALL 的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的 select_type 的值就是 DEPENDENT UNION。如图:
    在这里插入图片描述
  • DERIVED:对于采用物化的方式执行的包含派生表的查询,该派生表对应的子查询的 select_type 就是 DERIVED,如图:id为2的就是子查询

在这里插入图片描述

  • MATERIALIZED:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的 select_type 属性就是 MATERIALIZED。如图:

在这里插入图片描述
执行计划的第三条记录的 id 值为 2 ,说明该条记录对应的是一个单表查询,从它的 select_type 值为MATERIALIZED 可以看出,查询优化器是要把子查询先转换成物化表。然后看执行计划的前两条记录的 id 值都为 1 ,说明这两条记录对应的表进行连接查询,需要注意的是第二条记录的 table 列的值是 ,说明该表其实就是 id 为 2 对应的子查询执行之后产生的物化表,然后将 s1 和该物化表进行连接查询

UNCACHEABLE SUBQUERY和UNCACHEABLE UNION不常见,就不说了

物化表

当我们使用in嵌套select语句查询的时候,比如:
select * from user_info where id in (select user from test1)
如果in里面的数据只有几条还好的话,只需要拼接外层查询上就行了
select * from user_info where id in( 1,2,3…),这样只需要判断id=1 or id=2 or。。。
但是如果数据条数比较多呢,这样一条条判断到什么时候。所以mysql做了一个优化,就是不直接将这种不相关的子查询结果集作为外层的参数,而是将子查询的结果集放入一张临时表中。
临时表中的记录就是子查询的数据,将记录去重后写入。 并且为该临时表建立一个哈希索引,但是如果结果集的内容特别大,也会将索引形式转变为B+树索引。
那么,将这个子查询结果集,保存到临时表中的过程,就是称为 物化(Materialize)。为了方便起见, 就把存储子查询结果集的临时表称为 物化表

table

在我们的sql语句中,有的查询一张表,有的可能是多张表联合查询的。那这个字段就用来区分每个表各自的执行计划。
比如我们上面的图中查询的是一张表就是一条数据,那如果两张表的话,如下:
在这里插入图片描述

partitions

没用过,一般情况都是空,不用管

type

代表这每条执行记录的访问方法,不同的访问方法也可以提现出使用的索引级别,有这么多
system ,const ,eq_ref , ref ,fulltext ,ref_or_null ,index_merge ,unique_subquery , index_subquery,range , index , ALL

  • system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是 system
  • const:当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是 const
  • eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref
  • ref:当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是 ref
  • fulltext:全文索引
  • ref_or_null:当对普通二级索引进行等值匹配查询,该索引列的值也可以是 NULL 值时,那么对该表的访问方法就可能是ref_or_null
  • index_merge:通过多个索引合并的方式来进行单表查询
  • unique_subquery:针对in语句,如果子查询的in可以转换为exists查询,并且子查询是用主键进行等值匹配的话,就是unique_subquery 如图:
    在这里插入图片描述
  • ndex_subquery:与 unique_subquery 类似,只不过访问子查询中的表时使用的是普通的索引
  • range:如果使用索引获取某些 范围区间 的记录,那么就可能使用到 range 访问方法,比如 > <
  • index:可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是 index,比如查询和条件都在索引字段中,但是不符合左匹配原则。
  • ALL:全盘扫描

possible_keys和key

possible_keys 列表示在某个查询语句中,对某个表执行单表查询时可能用到的索引有哪些, key 列表示实际用到的索引有哪些;
因为在查询之前,直接关联到的索引,在执行优化器处理后,某些不算太优的方式就可能被放弃。比如同时关联了两个索引,但是一个索引的值全部都相同,用了还不如不用,那这个索引就可能被启用。
我们需要注意,possible_keys中可能被用到的索引越多,对于查询优化器计算成本时候的性能影响就越大, 所以我们应该尽量删除那些用不到的索引。

key_len

当优化器决定使用某个索引执行查询时,该索引记录的最大长度,它是由这三个部分构成的:

  • 对于使用固定长度类型的索引列来说,它实际占用的存储空间的最大长度就是该固定值,对于指定字符集的变长类型的索引列来说,比如某个索引列的类型是 VARCHAR(100) ,使用的字符集是 utf8 ,那么该列实际占用的最大存储空间就是 100 × 3 = 300 个字节。
  • 如果该索引列可以存储 NULL 值,则 key_len 比不可以存储 NULL 值时多1个字节。
  • 对于变长字段来说,都会有2个字节的空间来存储该变长列的实际长度。

ref

当使用索引进行等值匹配查询的时候,这个列展示的就是和索引进行等值匹配的东西是什么类型。
const 代表常量、 eq_ref 、 ref 、 ref_or_null 、unique_subquery 、 index_subquery
也有可能是表名列名等信息。

rows

如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的 rows 列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的 rows 列就代表预计扫描的索引记录行数

filtered

要结合前一个字段rows来看,大概可以理解为,上一个字段预计扫描数据记录行数,和真正要查询出来的数据行数百分比。
比如:select * form user_info where address = “浙江” and name = "a%"这个语句,索引是idx_address。会扫描索引中的200条数据,但是这200条中满足name = “a%” 的只有20条,那么这个filtered的值就是10.0

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】TCP协议详解

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 1、引言2、udp和tcp协议的异同3、tcp服务器3.1、接口认识3.2、服务器设计 4、tcp客户端4.1、客户端设计4.2、说明 5、再研Tcp服务端5.1、多进程版5.2、多线程版 5、守护进程化5.1、什么是守护进程5.2…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

【element ui】input输入控件绑定粘贴事件,从 Excel 复制的数据粘贴到输入框(el-input)时自动转换为逗号分隔的数据

目录 1、需求2、实现思路:3、控件绑定粘贴事件事件修饰符说明: 4、代码实现&#x1f680;写在最后 1、需求 在 Vue 2 和 Element UI 中&#xff0c;要实现从 Excel 复制空格分隔的数据&#xff0c;并在粘贴到输入框&#xff08;el-input&#xff09;时自动转换为逗号分隔的数据…

代码随想录训练第三十天|01背包理论基础、01背包、LeetCode416.分割等和子集

文章目录 01背包理论基础01背包二维dp数组01背包一维dp数组(滚动数组) 416.分割等和子集思路 01背包理论基础 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; leetcode上没有纯01背包的问题&#xff0c;都是01背包应用方面的题目&#xff0c;也就是…

领略诗词之妙,发觉生活之美。

文章目录 引言落霞与孤鹜齐飞,秋水共长天一色。野渡无人舟自横。吹灭读书灯,一身都是月。我醉欲眠卿且去,明朝有意抱琴来。赌书消得泼茶香,当时只道是寻常。月上柳梢头,人约黄昏后。最是人间留不住,朱颜辞镜花辞树。山中何事?松花酿酒,春水煎茶。似此星辰非昨夜,为谁风…

Github 2024-07-26开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目2TypeScript项目2C++项目2HTML项目1Python项目1C#项目1Lua项目1JavaScript项目1Vue项目1C项目1免费编程学习平台:freeCodeCamp.org 创…

vuepress搭建个人文档

vuepress搭建个人文档 文章目录 vuepress搭建个人文档前言一、VuePress了解二、vuepress-reco主题个人博客搭建三、vuepress博客部署四、vuepress后续补充 总结 vuepress搭建个人文档 所属目录&#xff1a;项目研究创建时间&#xff1a;2024/7/23作者&#xff1a;星云<Xing…

c++语言学习注意事项

当学习C语言时&#xff0c;有几个重要的注意事项可以帮助初学者更有效地掌握这门强大的编程语言&#xff1a; 1. 理解基本概念和语法 C 是一门复杂且功能强大的编程语言&#xff0c;因此理解其基本概念和语法至关重要。初学者应该重点掌握以下几个方面&#xff1a; 基本语法和…

WordPress原创插件:自定义文章标题颜色

插件设置截图 文章编辑时&#xff0c;右边会出现一个标题颜色设置&#xff0c;可以设置为任何颜色 更新记录&#xff1a;从输入颜色css代码&#xff0c;改为颜色选择器&#xff0c;更方便&#xff01; 插件免费下载 https://download.csdn.net/download/huayula/89585192…

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…

02、爬虫数据解析-Re解析

数据解析的目的是不拿到页面的全部内容&#xff0c;只拿到部分我们想要的内容内容。 Re解析就是正则解析&#xff0c;效率高准确性高。学习本节内容前需要学会基础的正则表达式。 一、正则匹配规则 1、常用元字符 . 匹配除换行符以外的字符 \w 匹配字母或数字或下划…

我当初装anaconda的时候浏览器默认下载路径在d盘,现在想用ipython的时候用不了了咋办?...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 红豆生南国&#xff0c;春来发几枝。 大家好&#xff0c;我是Python进阶者。 一、前言 前几天在Python白银交流群【041】问了一个Python环境的问题&am…

Vue中el的两种写法

大家好我是前端寄术区博主PleaSure乐事。今天了解到了Vue当中有关el的两种写法&#xff0c;记录下来与大家分享&#xff0c;希望对大家有所帮助。 方法一 解释 第一种方法我们直接用new创建并初始化一个新的 Vue 实例&#xff0c;并定义了 Vue 实例的数据对象&#xff0c;在给…

postman请求响应加解密

部分接口&#xff0c;需要请求加密后&#xff0c;在发动到后端。同时后端返回的响应内容&#xff0c;也是经过了加密。此时&#xff0c;我们先和开发获取到对应的【密钥】&#xff0c;然后在postman的预执行、后执行加入js脚本对明文请求进行加密&#xff0c;然后在发送请求&am…

【Vue实战教程】之 Vue Router 路由详解

Vue Router路由 1 路由基础 1.1 什么是路由 用Vue.js创建的项目是单页面应用&#xff0c;如果想要在项目中模拟出来类似于页面跳转的效果&#xff0c;就要使用路由。其实&#xff0c;我们不能只从字面的意思来理解路由&#xff0c;从字面上来看&#xff0c;很容易把路由联想…

WordPress插件介绍页源码单页Html

源码介绍 WordPress插件介绍页源码单页Html源码&#xff0c;这是一款产品介绍使用页面&#xff0c;也可以用来做其他软件或者应用介绍下载页&#xff0c;界面简约美观&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器…

Angular由一个bug说起之八:实践中遇到的一个数据颗粒度的问题

互联网产品离不开数据处理&#xff0c;数据处理有一些基本的原则包括&#xff1a;准确性、‌完整性、‌一致性、‌保密性、‌及时性。‌ 准确性&#xff1a;是数据处理的首要目标&#xff0c;‌确保数据的真实性和可靠性。‌准确的数据是进行分析和决策的基础&#xff0c;‌因此…

transformers进行学习率调整lr_scheduler(warmup)

一、get_scheduler实现warmup 1、warmup基本思想 Warmup&#xff08;预热&#xff09;是深度学习训练中的一种技巧&#xff0c;旨在逐步增加学习率以稳定训练过程&#xff0c;特别是在训练的早期阶段。它主要用于防止在训练初期因学习率过大导致的模型参数剧烈波动或不稳定。…

Unity3D之TCP网络通信(客户端)

文章目录 概述TCP核心类异步机制 Unity中创建TCP客户端Unity中其它脚本获取TCP客户端接受到的数据后续改进 本文将以Unity3D应用项目作为客户端去连接制定的服务器为例进行相关说明。 Unity官网参考资料&#xff1a; https://developer.unity.cn/projects/6572ea1bedbc2a001ef…