mysql查询语句执行全流程

我们在命令行输入sql语句或者借助框架查询接口在mysql执行查询,就可以得到与查询条件相匹配的数据,那mysql是用了什么样的架构和机制来实现的数据查询呢?下面就从架构和机制两方面来进行讲解。

架构

在这里插入图片描述
从图中可以看出,mysql框架分为两层:server层和存储引擎层。
server层包括mysql除数据存储和提取外的所有核心功能。

  • 连接器,提供数据库连接,获取权限,维持和管理连接;
  • 词法分析,输入的字符串做拆分和识别,解析出mysql的关键字等信息;
  • 语法分析,将识别出来的字符根据语法规则做校验;
  • 优化器,流转到优化器时已经确定了要在那些表上执行哪些数据操作,在该环节是确定使用那个索引以及多表关联场景下的语句执行顺序;
  • 执行器,对语句中涉及的表进行鉴权,鉴权通过后使用表中指定的引擎接口执行语句操作;

存储引擎层提供数据的存储和提取。

机制

方式作用
索引加速查询和定位数据
sortBuffer,joinBuffer,groupBuffer优化排序和联表查询场景的查询性能
MVCC(多版本并发控制协议)满足特定事务隔离级别
借助锁实现并发控制

索引

索引,使用空间换时间的思想来加速查询。

分类形式名称
叶节点存储数据聚簇索引,非聚簇索引
索引功能主键索引,唯一索引,普通索引

以innodb存储引擎为例,非主键索引的叶节点存储的是主键,需要通过回表的方式查询主键索引获取到记录的详细信息。但是回表操作的开销较大,所以根据数据查询的实际场景做了索引覆盖,索引下沉等优化。
新建索引的指导思想是以最小的代价达到加速查询的目标,非聚簇索引叶节点存放的是主键键值,因此为了减少存储开销需要选择数据量较小的字段作为主键。主键索引叶子节点存放的是具体数据,而且innodb是以数据页的形式批量存储数据,结合操作系统顺序存储的方式需要设置递增主键来减少随机存储的开销。
普通索引唯一索引在查询性能基本一致,但是唯一索引在写入时需要先读取数据判断是否有唯一键冲突,开销更大。因此非必要一般使用普通索引。

索引的选用,优化器在拿到待执行的sql后,会分析查询条件可以命中哪些索引,然后综合考虑扫描行数,回表开销,排序开销,索引区分度(基数)等开销来最终确定使用哪个索引,但是这种方式也会有反向优化的问题。

buffer

sortBuffer主要优化排序的执行效率,在sortBuffer大小不足以支撑排序时会使用排序文件来进行排序。具体到参与排序的字段,有两种选取形式:全字段排序和rowId排序。其中rowId排序需要额外的回表操作,会新增磁盘读取的消耗。所以存储引擎会优先使用sortBuffer+全字段排序。
在基于业务需求设计排序查询时,可以提前设计索引结构,借助索引字段的有序性避免存储引擎每次执行排序操作。

MVCC

MVCC(Multi Version Concurrency Control)多版本并发控制机制,与基于锁的并发控制相对应,减少了读多写少场景下读操作的加锁开销。MVCC是由读视图、undo log和行锁一同实现的读、更新分离控制。
一个事务创建时会向innodb事务管理系统申请新的事务id,每行数据又会对应多个版本,每行数据多版本就是借助事务id和undo log实现的。如下图所示行数据的多个版本按照链式串联起来,每个虚线箭头就是一个undo log。
在这里插入图片描述
每个事务开始后多会新建一个自己的读视图数组,也就是所谓的“快照”,数组分为三段:当前最小活跃事务id,最大活跃事务id+1,和中间区间活跃事务。
规则:

  • 小于最小事务id的所有数据,均为当前事务创建前提交的数据可直接读取
  • 大于最大事务id+1的所有数据,均为当前事务创建后产生的数据均不可读取
  • 介于两者之间的数据,分两种情况
    • 事务id在数组中,则表明当前事务创建时事务已经创建但是未提交,所以不可读取
    • 事务id不在数组中,则表明当前事务创建时事务为已提交状态(非活跃),所以可以读取
      在这里插入图片描述
      在了解了视图、undo log概念后一块看一下RR隔离界别下事务读取、更新数据的过程。
操作类型innodb实现
事务中查询数据RR级别下接祖快照读方式实现,仅可读取事务创建那一刻的数据,也就是事务创建那一刻已经完成提交的数据
事务中更新数据更新操作因为涉及到数据变更,所以必须是当前读然后再进行数据的更新操作。当前读的实现是借助redo log和行锁实现的,竞争到需要变更的行锁后读取当前数据然后进行变更

参考:
1.极客时间:MySQL实战45讲

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

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

相关文章

EasyDSS视频推拉流技术的应用与安防摄像机视频采集参数

安防摄像机的视频采集参数对于确保监控系统的有效性和图像质量至关重要。这些参数不仅影响视频的清晰度和流畅度,还直接影响存储和网络传输的需求。 安防摄像机图像效果的好坏,由DSP处理器和图像传感器sensor决定,如何利用好已有的硬件资源&…

简单的Activiti Modoler 流程在线编辑器

简单的Activiti Modoler 流程在线编辑器 1.需求 我们公司使用的流程是activiti5.22.0,版本有些老了,然后使用的编辑器都是eclipse的流程编辑器插件,每次编辑流程需要打开eclipse进行编辑,然后再导入到项目里面,不是特…

【CSS in Depth 2 精译_064】10.3 CSS 中的容器查询相对单位 + 10.4 CSS 容器样式查询 + 10.5 本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 10.2.1 容器的类型10.2.2 容器的名称10.2.3 容器与模块化 CSS 10.3 与容器相关的单位 ✔…

【通信协议】CAN总线通信协议的学习,(三)stm32f103系列单片机,can通信的代码实现

目录 1、CAN 的基本知识 2、CAN的cubemx配置 3、CAN的代码实现 3.0、初始化,认识函数及变量 3.1、CAN发送 3.1.1、代码1 3.1.2、代码2 3.1.3、代码3 3.2、CAN中断接收 3.2.1、代码1 3.2.2、代码2 3.2.3、代码3 3.3、过滤器 3.3.1、代码1 3.3.2、代码…

数字图像处理期末(一)

一、绪论 1.图像:是客观对象的一种表示,它包含了被描述对象的有关信息。 数字图像:像素组成的二维排列,可以用矩阵表示。每一个元素具有一个 特定的位置(x,y)和幅值f(x,y),这些元素就称为像素。 2.图像处理…

atoi函数的模拟实现

首先让让我们先了解了解这个函数的信息吧! int atoi (const char * str); 该函数首先根据需要丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符。然后,从这个字符开始,接受一个可选的初始…

中科院一区算法KO-K均值优化算法(K-means Optimizer)-附Matlab免费代码

首先,使用K-means算法在每次迭代中建立聚类区域的形心向量,然后KO提出两种移动策略,以在开发和探索能力之间建立平衡。每次迭代中探索或开发的移动策略的决定取决于一个参数,该参数将被设计为识别每个搜索代理是否在访问的区域中过…

关于 vue+element 日期时间选择器 限制只能选当天以及30天之前的日期

业务需求&#xff0c;需要实现选择当天以及30天之前的日期&#xff0c;于是我想到的是利用picker-options去限制可选范围 代码如下 <el-date-pickerv-model"searchData.acceptTime"type"datetimerange"value-format"yyyy-MM-dd hh:mm:ss"styl…

[极客大挑战 2019]PHP--详细解析

信息搜集 想查看页面源代码&#xff0c;但是右键没有这个选项。 我们可以ctrlu或者在url前面加view-source:查看&#xff1a; 没什么有用信息。根据页面的hint&#xff0c;我们考虑扫一下目录看看能不能扫出一些文件. 扫到了备份文件www.zip&#xff0c;解压一下查看网站源代码…

[AI] 知之AI推出3D智能宠物:助力语言学习与口语提升的新选择

Hello! 知之AI官网 [AI] 知之AI推出3D智能宠物&#xff1a;助力语言学习与口语提升的新选择 随着人工智能技术的飞速发展&#xff0c;虚拟助手和智能设备不断进入我们的生活。近日&#xff0c;知之AI重磅推出了一款创新产品——3D智能宠物。这一产品不仅具备多国语言交流能力&…

华为小米苹果三星移动设备访问windows共享文件夹windows11

如果移动设备和windows电脑都在同一个局域网内&#xff0c;可以用移动设备访问windows11的共享文件夹 1、设置共享文件夹 2、添加everyone用户即可 3、查看ip地址 4、在华为手机上点击文件管理&#xff0c;里面有个网上邻居 5、正常情况下&#xff0c;华为手机会扫描到同一局域…

Windows基础(2)完结

声明 学习视频来自 B 站up主泷羽sec&#xff0c;如有涉及侵权马上删除文章。 在学习的过程中记笔记&#xff0c;分享笔记方便各位师傅学习&#xff0c;以下内容只涉及学习内容&#xff0c;任何其他违法行为与本人及泷羽sec无关&#xff0c;请务必遵守法律法规&#xff0c;切莫…

Spring Boot优雅读取配置信息 @EnableConfigurationProperties

很多时候我们需要将一些常用的配置信息比如oss等相关配置信息放到配置文件中。常用的有以下几种&#xff0c;相信大家比较熟悉&#xff1a; 1、Value(“${property}”) 读取比较简单的配置信息&#xff1a; 2、ConfigurationProperties(prefix “property”)读取配置信息并与 …

深度学习基础02_损失函数BP算法(上)

目录 一、损失函数 1、线性回归损失函数 1.MAE损失 2.MSE损失 3.SmoothL1Loss 2、多分类损失函数--CrossEntropyLoss 3、二分类损失函数--BCELoss 4、总结 二、BP算法 1、前向传播 1.输入层(Input Layer)到隐藏层(Hidden Layer) 2.隐藏层(Hidden Layer)到输出层(Ou…

排序学习整理(2)

上集回顾 排序学习整理&#xff08;1&#xff09;-CSDN博客 2.3 交换排序 交换排序的基本思想是&#xff1a;根据序列中两个记录键值的比较结果&#xff0c;交换这两个记录在序列中的位置。 特点&#xff1a; 通过比较和交换操作&#xff0c;将键值较大的记录逐步移动到序列…

基于大数据python 房屋价格数据分析预测可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很对人不知道选题怎么选 不清楚自己适合做哪块内容 都可以免费来问我 避免后期給自己答辩找麻烦 增加难度&#xff08;部分学校只有一次答辩机会 没弄好就延迟…

Observability:如何在 Kubernetes pod 中轻松添加应用程序监控

作者&#xff1a;来自 Elastic Jack Shirazi•Sylvain Juge•Alexander Wert Elastic APM K8s Attacher 允许将 Elastic APM 应用程序代理&#xff08;例如 Elastic APM Java 代理&#xff09;自动安装到 Kubernetes 集群中运行的应用程序中。该机制使用变异 webhook&#xff0…

权限提升漏洞之Netlogon协议详解 以及可能出现得漏洞分析

1.Netlogon服务1 Netlogon服务为域内的身份验证提供一个安全通道 它被用于执行与域用户和机器身份验证相关的各种任务&#xff0c;最常见的是让用户使用NTLM协议登录服务器。 默认情况下&#xff0c;Netlogon服务在域内所有机器后台运行 2.Netlogon服务2 Netlogon服务为域内的…

图像显示的是矩阵的行和列,修改为坐标范围。

x 3; y 3; f1x x^2 y^2; guance1 f1x; F (x, y) sqrt((x.^2 y.^2 - guance1).^2); % 使用点乘 [x, y] meshgrid(0:1:5, 0:1:5); Z F(x, y); figure; imagesc(Z); % 由于 imagesc 使用矩阵索引作为坐标&#xff0c;我们需要手动添加刻度 % 这里我们假设 x 和 y 的范围…

泷羽Sec-星河飞雪-BurpSuite之解码、日志、对比模块基础使用

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…