MySQL InnoDB中一个update语句从执行到提交的全过程(1)

news2024/11/13 9:19:37

目录

一、开启事务

二、sql解析、查询计划生成

三、查询要修改的数据

1、读buffer pool的过程

buffer pool的结构组成

1)Free List (空闲链表)

2)LRU List (最近最少使用链表)

3)Flush List (刷新链表)

三条链表之间的关系

2、怎么样在buffer pool中找到我们想要的页?

3、解析页的过程

以数据页为例,页的结构


一、开启事务

默认情况下autocommit=1,如果我们没有显式开启事务,而是直接执行update,那么MySQL就会隐式地为我们开启一个事务,并在这条update执行结束后自动提交。

如果set autocommit=0,或者先执行了begin;/start transaction;显式开启事务,那么update执行完成后不会自动提交,需要我们手动发起commit;或者rollback;。

不管用哪种方式开启事务后,MySQL都会在事务内第一次执行增删改操作时,给事务分配一个事务号。假定我们这条update所在的事务事务号为T1024。

二、sql解析、查询计划生成

在Mysql8.0之前,有查询缓存模块。

MySQL需要监测查询缓存涉及的每张表,只要这张表发生了任何变化,都要使其缓存失效。

查询缓存生效的条件是查询语句完全一致,如果新的语句多了一个空格,或者大小写发生变化,查询缓存都不能生效。

查询缓存在MySQL 5.7版本已经默认禁用了,在MySQL8.0版本更是直接被删除。

三、查询要修改的数据

在执行UPDATE之前,InnoDB需要先定位需要修改的记录。这通常涉及到对索引的查找。

对磁盘和bufferpool的读取都是以页为单位:表空间号+页号。

传入页号这个参数到buffer pool,然后buffer pool判断这个页是否在buffer pool中。如果该记录的页已经在buffer pool中,那么InnoDB直接从buffer pool中读取,直接返回我们想要的页。如果不在,InnoDB会从磁盘上加载相应的页到buffer pool中,再返回。

1、读buffer pool的过程

我们还不清楚buffer pool内部是怎么获取、保存、管理页的。

buffer pool的结构组成

在 MySQL InnoDB 存储引擎中,Buffer Pool 是管理数据库页(page)的核心组件,负责在内存中缓存数据页以加速数据库操作。为了高效地管理和调度这些页,InnoDB 使用了三条主要的链表:Free ListLRU ListFlush List。这些链表各自负责不同的管理任务,并相互协作来确保内存使用的高效性和数据的一致性。

1)Free List (空闲链表)

描述:空闲链,主要负责管理未被使用的缓冲池空间。

Free List 维护的是已经从 Buffer Pool 中释放出来的、当前不再被使用的内存页。它充当了内存池的角色,当新的页需要加载到 Buffer Pool 中时,如果没有空闲空间,InnoDB 会从 Free List 中获取空闲的页来加载新数据。

作用:为即将载入 Buffer Pool 的新页提供空闲空间。

与 LRU List 的关系:当页被淘汰出 LRU List 后,如果不再需要使用,该页会被加入到 Free List 中。

2)LRU List (最近最少使用链表)

描述:最近最少使用链,主要负责在缓冲池满时淘汰缓冲页。

LRU List (Least Recently Used) 是 Buffer Pool 的核心链表,负责管理已经载入内存但尚未被淘汰的页。页的访问顺序决定了它们在 LRU List 中的位置。最近被访问的页会移动到 LRU List 的热端(热链表),而较少访问的页会逐渐滑向冷端(冷链表)。

作用:用于决定哪些页可以保留在 Buffer Pool 中,以提高缓存的命中率。最近访问频繁的页保留在热端,而不常访问的页可能会被淘汰,腾出空间给新页。

buffer pool采用LRU(Least Recently Used)算法来管理页。如果buffer pool已满,则会根据LRU策略淘汰最久未使用的页,以腾出空间来加载新的页。

与 Free List 的关系:当页在 LRU List 中到达冷端并且不再使用时,可能会被从 LRU List 中移除并放入 Free List

3)Flush List (刷新链表)

描述:脏链,主要负责管理要被刷新到磁盘的页。

Flush List 维护了所有脏页的列表,这些页已经在内存中被修改,但还没有将修改后的数据写回磁盘。当需要释放 Buffer Pool 的内存或在适当的时间点时,脏页会从 Flush List 中被取出,并被刷写到磁盘以保证数据的一致性。

作用:负责将脏页刷新到磁盘,以确保事务提交时的数据一致性和持久性。

与 LRU List 的关系:当一个页在 Buffer Pool 中被修改后,它会同时存在于 LRU List 和 Flush List 中。脏页仍然会按照 LRU 规则进行管理,但它们同时在 Flush List 中等待被刷新到磁盘。

三条链表之间的关系

1)加载新页:当从磁盘加载一个新页到 Buffer Pool 时,InnoDB 会优先查看 Free List 中是否有可用的空闲页。如果有,则从 Free List 中分配;如果没有,则从 LRU List 的冷端淘汰较少使用的页,并将其放入 Free List

2)访问页:当某个页在 Buffer Pool 中被访问时,该页会被移动到 LRU List 的热端,以防止它被淘汰。

3)页的修改和刷新

  • 当页被修改时,它会被标记为脏页并加入到 Flush List 中。此时它仍然存在于 LRU List 中,按照访问频率进行排序。
  • 后台线程会周期性地扫描 Flush List,将脏页刷写回磁盘,以减少 Buffer Pool 中的脏页数量。
  • 淘汰页:当 LRU List 中的页达到冷端并且未被访问时,它可能会被淘汰出 Buffer Pool。如果它是脏页,则需要先将其刷新到磁盘,然后再移出 LRU List 并加入 Free List

这三条链表通过协同工作,高效地管理 Buffer Pool 中的页,使得 MySQL 能够在高并发环境下保持性能和数据的一致性。

2、怎么样在buffer pool中找到我们想要的页?

(1)通过 B+ 树索引定位页

InnoDB 使用 B+ 树索引结构来存储数据表中的数据,这种索引结构使得查找某一特定页的过程高效且快速。定位页的过程如下:

  • 索引查找:如果一个 SQL 语句通过索引来访问数据(如通过 WHERE 子句指定的条件),则 InnoDB 会先查找索引 B+ 树中的叶节点,以定位数据页或记录所在的具体位置。
  • 叶节点和页映射:B+ 树的叶节点包含了索引列的值和指向包含实际数据行的页的指针。通过这些指针,InnoDB 可以直接定位到存储目标数据的页。

(2) 检查页是否在 Buffer Pool 中

一旦 InnoDB 知道了需要访问的页的地址(page_id),它会在 buffer pool 中查找该页是否已经被加载。

buffer pool 内部使用哈希表来加速页的查找。每个数据页在 buffer pool 中都有一个对应的哈希表项。

  • 哈希表的键通常是由 page_id 构成,它唯一标识了页在 buffer pool 中的位置。
  • 哈希表项包含信息:每个哈希表项都包含页的元数据,如页所在的内存地址、页的状态(如脏页、已锁定等)、页的引用计数等。

因此,InnoDB 通过计算哈希值,快速在哈希表中找到对应的页控制块(Page Control Block)。

(3)页的状态检查

如果页在 buffer pool 中找到了,InnoDB 需要进一步检查页的状态,以确保页可以被当前事务访问:

  • 引用计数(ref_count):表示页被引用的次数。如果页的引用计数大于零,说明页当前正被其他事务或查询使用。
  • 锁状态:InnoDB 需要检查页是否被其他事务锁定,以及锁的类型(如共享锁、排他锁等)。根据当前事务的需要,决定是等待锁释放还是直接访问页。

(4)从磁盘加载页到 Buffer Pool

如果在 buffer pool 中未找到所需的页,或者页的状态不满足当前事务的需要,InnoDB 会从磁盘加载页到 buffer pool 中:

  • 从 Free List 获取空闲页:如果 buffer pool 中有可用的空闲页,InnoDB 会从 Free List 中获取一个空闲页,准备加载新数据。
  • 从磁盘读取页:InnoDB 根据 page_id,从表空间文件中读取页的数据到 buffer pool 的空闲页中。
  • 更新哈希表:新加载的页会被添加到哈希表中,并且更新其页控制块的信息。

(5)将页插入到 LRU List 中

新加载的页或被访问的页会被插入到 LRU List 的热端,表示这是最近使用的页,应该保留在内存中以加速未来的访问。

如果 buffer pool 已满,LRU List 的冷端的页可能会被淘汰。这些页要么被移入 Free List,要么被写入磁盘(如果是脏页)。

(6)返回页给事务

一旦页被成功地定位并加载到 buffer pool 中,InnoDB 就可以将页返回给当前事务,供其进行读或写操作。

(7)维护页的一致性

在页被使用过程中,InnoDB 会通过一系列机制来确保数据的一致性和完整性:

  • 锁定和并发控制:InnoDB 通过锁机制(如行锁、间隙锁等)来控制并发事务对页的访问,避免数据不一致的情况。
  • 脏页管理:修改过的页会被标记为脏页,并加入到 Flush List 中,等待后台线程将其写回磁盘。
  • 日志记录:InnoDB 还会将对页的修改记录到 redo log 和 undo log 中,以支持崩溃恢复和事务回滚。

3、解析页的过程

怎样从一个16k的数据页中找到我们想要的数据?

以数据页为例,页的结构

实际上每条数据在物理上是乱序的,逻辑上用一个单向链表连接起来。链表以infimum和supremum这两个特殊记录标记首尾。infimum指向第一条记录,最后一条记录指向supremum。

每个数据页都有一个页目录,它包含指向页中若干记录的指针(通常是记录头部)。这些指针指向的记录是页中某些分段的起点。因此,页最后的pagedirectory结构(类似数组)可以帮我们加快对页的搜索。

由于记录是有序存储的,InnoDB 使用二分查找算法快速定位到目标记录在页中的位置。

查找一个数据页时,就会在Page Directory进行二分查找每次查找都要取到槽对应的行进行主键的比较;直到最终找到数据或确认没有对应的数据。

  • InnoDB 先从页目录中找到接近目标记录的指针,再从这个指针开始顺序扫描记录,直到找到目标记录。这种方式比全表扫描更高效。
  • 在页中,记录通过双向链表链接起来。每条记录有指向前后记录的指针(next_record 和 prev_record),InnoDB 可以通过这个链表依次遍历页中的记录。
  • 一旦定位到目标记录的起始位置,InnoDB 会沿着链表遍历,通过next_record,直到找到与查询条件匹配的记录。

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

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

相关文章

[Linux][OS][信号的保存和处理]

目录 信号的处理 1. 在内核中的表示 2. 相关概念 3. 信号集操作函数 4.sigprocmask 5.sigpending 信号的捕捉 重谈地址空间 信号的处理 1. 在内核中的表示 普通信号,多次产生只会记录一次 信号范围 [1,31],每一种信号都要有自己的一种处理方式…

Java Spring|day3.SpringBoot

Spring Boot 定义 从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。Spring Boot使用“习惯优于配置”的理念让你的项目快速地运行起来,使用Spring Boot很容易创建一个能独立运行、准生产级别、基于S…

SpringBoot + Hadoop + HDFS + Vue 实现一个简单的文件管理系统

1. 安装前的准备工作 1.1 更新系统并安装必要的工具 在终端中运行以下命令: sudo apt-get update sudo apt-get install -y ssh rsync curl1.2 安装 Java 如果系统中没有安装 Java,可以通过以下命令安装 OpenJDK: sudo apt-get install …

软件安全测试的必要性,第三方软件测试机构进行安全测试好处简析

在当前信息技术迅猛发展的时代,软件的安全性显得尤为重要。随着越来越多的企业依赖软件进行日常运营,软件漏洞和安全隐患所带来的风险也逐渐上升。因此,软件安全测试不再是可有可无的选择,而是每个企业必须考虑的关键环节。 一、…

Node之npm常用命令与package.json文件

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) npm常用命令 npm默认与Node.js一起安装,可以在命令行中输入…

达梦数据库系列—49.审计功能

目录 1、打开审计 2、审计级别 系统级审计 语句级审计 对象级审计 3、审计文件管理 删除审计文件 查看审计信息 4、审计分析 审计分析工具Analyzer 审计分析工具dmaudtool 1、打开审计 0:关闭审计1:打开普通审计2:打开普通审计和…

qt 5.15.2 使用pdf

1. 安装Qt 5.15.2 选择对应编译器和源码: 安装后已有pdf对应的库和源码: 将QtPdf和QtPdfWidgets目录拷贝到msvc2019_64/include(根据需要用到的编译器而定) 将C:\Qt\5.15.2\Src\qtwebengine\src\pdf\api所有文件拷贝到C:\Qt\5.15.2\msvc2019_64\include\…

低功耗蓝牙协议栈如何学习?

目录 1. 基础知识 1.1 了解BLE基本概念 1.2 阅读BLE规范 2. 实践和开发工具 2.1 使用开发板 2.2 安装开发环境 3. 学习资源 3.1 官方文档和示例 3.2 在线课程和教程 4. 实践项目 4.1 简单项目 4.2 复杂项目 5. 深入理解协议栈 5.1 分析协议栈 5.2 调试和分析 6…

v-charts的下载与引用

近期,因项目需要,需用v-charts做一些登录后首页的展示图,按之前的逻辑echarts官网都有API直接拿来用就行了,但是我的项目框架是vuespringboot,我的vue版本是2.6.1,这个v-charts文档在网上搜了搜&#xff0c…

nginx服务部署及其平滑升级

概述 1. 7层负载均衡(nginx) 1. 停掉4层的环境 systemctl disable --now keepalived.service # 停用之前的4层协议方式2. 源码安装nginx tar zxf nginx-1.22.1.tar.gz 具体方式是源码编译“三部曲” ./configure # 负责检查环境,生成指导…

每日OJ_牛客_星际密码(矩阵+斐波那契)

目录 牛客_星际密码(矩阵斐波那契) 解析代码 牛客_星际密码(矩阵斐波那契) 星际密码__牛客网 解析代码 这个题目首先需要明确矩阵是固定的,其次是矩阵相乘的方法。解题思路:初始化斐波那契数列&#xff…

leetcode刷题-二叉树05

代码随想录二叉树part05|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树 654.最大二叉树一遍过,不过貌似有多种解法,后序再补充 617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树看其他解题方法 654.最大二叉树 代码…

RCE的另外一些绕过练习

目录 被过滤了flag怎么办 方法 结果 过滤了flag、php、system 方法一 结果 ​编辑 方法二 过滤了很多但是主要的就是过滤了空格 和 注意一下这个就行 方法一 方法二 相对于上面一道题来说多过滤了一个括号 方法一 被过滤了flag怎么办 <?php error_reportin…

29岁才转行软件测试,目前31了,我的一些经历跟感受

按惯例&#xff0c;先说下我基本情况。我是90年的&#xff0c;算是最早的90后&#xff0c;现在跟你介绍的时候还恬不知耻的说我是90后&#xff0c;哈哈&#xff0c;计算机专业普通本科毕业。在一个二线城市&#xff0c;毕业后因为自身能力问题、认知水平问题&#xff0c;再加上…

Cesium倾斜相机视角观察物体

先看效果&#xff1a; 在cesium中&#xff0c;我们有时需要倾斜相机视角去观察物体&#xff0c;如相机俯视45观察物体。 cesium的api提供了倾斜相机视角的配置&#xff0c;但是直接使用cesium的api不能达到我们想要的效果。 函数如下&#xff1a; function flyToBox() {let l…

XSS反射性

目录 1.URL 编码 "javascript:alert(1)" 2.HTML字符实体编码 &#;"javascript" 和 URL 编码 "alert(2)" 3.URL 编码 ":" 就是%3a 4.HTML字符实体编码 < 和 > 5.HTML字符实体编码 < 和 > 6.<s…

UGUI合批个人学习心得

从目前学到的知识上看&#xff0c;合批就是最基础的条件就是需要贴图和材质相同&#xff0c;这两个一样才有可能合批&#xff0c;UGUI合批是以Canvas为单位的。 UGUI的合批就是把某个Canvas下满足合批规则的UI控件的网格合并为一个大的网格&#xff0c;然后将这些网格合并在一起…

MyBatis首篇-入门第一文

目录 MyBatis关键特性和概念使用步骤简单示例 核心组件主要特点常见使用情景常见优化策略 MyBatis MyBatis是一个优秀的半自动化持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了大部分JDBC代码和手动设置参数以及获取结果集的繁琐性。用户只需要…

机器学习/深度学习——模型的欠拟合和过拟合,正则化方法详解

机器学习/深度学习——模型的欠拟合和过拟合&#xff0c;正则化方法 详解 搭配以下文章进行学习&#xff1a; 卷积神经网络&#xff1a; 深度学习——卷积神经网络&#xff08;convolutional neural network&#xff09;CNN详解&#xff08;一&#xff09;——概述. 步骤清晰…

WHD温湿度控制器:智能守护,让电力设备远离“温湿”困扰,安全运行每一刻

​在电力系统的庞大网络中&#xff0c;中高压开关柜、端子箱、环网柜及箱变等关键设备&#xff0c;其稳定运行直接关系到电力供应的安全与效率。WHD系列温湿度控制器以智能化、精准化的温湿管理方案&#xff0c;为电力设备筑起了一道坚不可摧的安全防线。 WHD系列温湿度控制器搭…