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.xdnf.cn/news/1488891.html

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

相关文章

模拟can信号实现通信

实车上算法一般通过ros进行通信&#xff0c;车辆和控制器之间则通过can通信实现&#xff0c;今天来学习一下如何模拟这个can。 can信号的发送和接收一般是需要载体的&#xff0c;我们一般都有can0和can1设备可以使用&#xff0c;在电脑上创建这个设备&#xff1a; 加载vcan内核…

数据库开发:MySQL基础(二)

MySQL基础&#xff08;二&#xff09; 一、表的关联关系 在关系型数据库中&#xff0c;表之间可以通过关联关系进行连接和查询。关联关系是指两个或多个表之间的关系&#xff0c;通过共享相同的列或键来建立连接。常见的关联关系有三种类型&#xff1a;一对多关系&#xff0c;…

Talk|新加坡国立大学赵轩磊:Pyramid Attention Broadcast - 通向视频模型的实时生成

本期为TechBeat人工智能社区第612期线上Talk&#xff01; 北京时间7月25日(周四)20:00&#xff0c;新加坡国立大学博士生—赵轩磊的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “Pyramid Attention Broadcast - 通向视频模型的实时生成”&#x…

Spring Boot中如何实现全链路调用日志跟踪?

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 引言 在Spring Boot中实现全链路调用日志跟踪&#xff0c;主要依赖于Mapped Diagnostic Context&#xff08;MDC&#xff09;功能。MDC是一种用于在多线程条件下记录日志的功能&#xff0c;它可以看作是与当…

深入分析 Android ContentProvider (五)

文章目录 深入分析 Android ContentProvider (五)ContentProvider 的性能优化和实践案例1. 性能优化技巧1.1. 数据库索引优化示例&#xff1a;添加索引 1.2. 批量操作与事务管理示例&#xff1a;批量插入操作 1.3. 使用异步操作示例&#xff1a;使用 AsyncTask 进行异步查询 1.…

Nodejs实现微信订阅消息的发送

关于Nodejs的项目配置和路由配置我这里就不过多叙述了。着重关于订阅消息的发送 1.首先前往微信开发者平台配置好自己的订阅消息模板&#xff08;改版后的只支持一次性订阅&#xff1a;每次用户操作记录一次&#xff0c;openid只能发送一次消息给用户&#xff0c;不能持续订阅…

每日一知识点- Java 方法重载和方法重写

目录 &#x1f4dd; 每日一知识点方法重载方法重写 &#x1f4ce; 参考文章 &#x1f600; 准备好了吗&#xff1f;让我们一起步入这座Java神奇的城堡&#xff0c;揭开方法重载&#xff08;Overloading&#xff09;和方法重写&#xff08;Overriding&#xff09;的神秘面纱。 &…

基于迁移学习的手势分类模型训练

1、基本原理介绍 这里介绍的单指模型迁移。一般我们训练模型时&#xff0c;往往会自定义一个模型类&#xff0c;这个类中定义了神经网络的结构&#xff0c;训练时将数据集输入&#xff0c;从0开始训练&#xff1b;而迁移学习中&#xff08;单指模型迁移策略&#xff09;&#x…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法&#xff0c;不过多介绍&#xff0c;是基于深度学习的目标检测算法中最出名、发展最好的检测器&#xff0c;没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程&#xff0c;详细技术细节不过多介绍&#xff0c;只提及改进点&#xff0c;适合初学者…

Vue3二次封装axios

官网: https://www.axios-http.cn/docs/interceptors steps1: 安装 npm install axios -ssteps2: /src/api/request.js 文件 >>> 拦截器 import axios from axios // 如果没用element-plus就不引入 import { ElMessage } from element-plusconst service axios.cre…

7月22日学习笔记 文件共享服务nfs,SAMBA文件共享与DNS域名服务

任务背景 由于业务驱动&#xff0c;为了提⾼⽤户的访问效率&#xff0c;现需要将原有web服务器上的静态资源 ⽂件分离出来&#xff0c;单独保存到⼀台⽂件服务器上。 任务要求 1. ⼀台应⽤服务器web-server部署apache&#xff0c;静态⽹⻚资源存放在另外⼀台NFS服 务器上 …

四、GD32 MCU 常见外设介绍 (2) GPIO 模块介绍

2.GPIO 模块介绍 GPIO的全称为通用输入输出口&#xff0c;是很多外设能够正常工作的必要条件。除了一些特定功能的引脚(如电源脚)外&#xff0c;MCU上其他的引脚都可以当做GPIO来使用。本章&#xff0c;我们将对GPIO进行简单介绍&#xff0c;并通过一个“流水灯”的实验来熟悉…

MATLAB基础:数组及其数学运算

今天我们继续学习MATLAB中的数组 我们在学习MATLAB时了解到&#xff0c;MATLAB作者秉持着“万物皆可矩阵”的思想企图将数学甚至世间万物使用矩阵表示出来&#xff0c;而矩阵的处理&#xff0c;自然成了这门语言的重中之重。 数组基础 在MATLAB中&#xff0c;数组是一个基本…

【人工智能 | 机器学习 | 理论篇】线性模型

文章目录 1. 基本形式2. 线性回归3. 对数几率回归4. 线性判别分析5. 多分类学习6. 类别不平衡问题 1. 基本形式 设有 d 个属性描述的示例 x ( x 1 , x 2 , x 3 , . . . , x d ) x ({x_1, x_2, x_3, ..., x_d}) x(x1​,x2​,x3​,...,xd​) 线性模型&#xff08;linear mode…

使用C#手搓Word插件

WordTools主要功能介绍 编码语言&#xff1a;C#【VSTO】 1、选择 1.1、表格 作用&#xff1a;全选文档中的表格&#xff1b; 1.2、表头 作用&#xff1a;全选文档所有表格的表头【第一行】&#xff1b; 1.3、表正文 全选文档中所有表格的除表头部分【除第一行部分】 1.…

Android AI应用开发:移动检测

基于Google ML模型的Android移动物体检测应用——检测、跟踪视频中的物体 A. 项目描述 ML Kit物体检测器可以对视频流进行操作&#xff0c;能够检测视频中的物体并在连续视频帧中跟踪该物体。 相机捕捉视频时&#xff0c;检测到移动物体并为其生成一个边界框&#xff0c;并分…

【性能测试-登录时密码加密存储如何传参】

目的】 登录接口&#xff0c;密码加密传输&#xff0c;开发不做处理的情况下&#xff0c;密码如何加密传输 【方案】 使用前置处理器&#xff1a;JSR223 预处理程序&#xff0c;主要是在执行登录接口前将密码按照加密算法获得对应的加密密码&#xff0c;并传入接口 【说明】前…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 亲子游戏(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

【BUG】已解决:TypeError: a bytes-like object is required, not ‘str‘

TypeError: a bytes-like object is required, not ‘str‘ 目录 TypeError: a bytes-like object is required, not ‘str‘ 【常见模块错误】 【解决方案】 错误原因分析 解决方案 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net…

基于扩散的生成模型的语音增强和去噪

第二章 目标说话人提取之《Speech Enhancement and Dereverberation with Diffusion-based Generative Models》 文章目录 前言一、任务二、动机三、挑战四、方法1.方法:基于分数的语音增强生成模型(sgmse)2.网络结构 五、实验评价1.数据集2.采样器设置和评价指标3.基线模型4.评…