当前位置: 首页 > news >正文

MVCC和BufferPool缓存机制

文章目录

    • 1. MVCC多版本并发控制机制
    • 2. BufferPool缓存机制

1. MVCC多版本并发控制机制

Mysql可以在可重复读隔离级别下可以保证事务较高的隔离性,这个隔离性是由MVCC机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。
undo日志版本链与read view机制详解
undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id(事务ID)和roll_pointer(会滚指针)把这些undo日志串联起来形成一个历史记录版本链。

trx_id:表示对数据修改的事务的ID
roll_pointer:指向被修改数据的上一个版本

在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事 id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。

注意:begin/start transaction命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB表的语句时事务才算是真正的启动,此时事务会向Mysql申请事务ID,mysql内部是严格按照事务的启动顺序来分配事务ID的

在这里插入图片描述

版本链比对规则:

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;
  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的);
  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自
    己的事务是可见的);
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。

read-view执行原理案例分析
这里首先列出了五个事务的sql语句执行情况,如下:
在这里插入图片描述

由上图可见,总共有五个事务,事务的id为100,200,300,1,2,下面我们就来逐步分析:

  1. 首先事务300执行update account set name = 'lilei300' where id = 1;然后提交。接着事务ID为1的事务执行select name from account where id = 1;

我们可以很简单的看出查询结果为lilei300,那为什么会是lilei300。首先我们可以看出此时的undo.log的日志版本链的情况是这样的:

在这里插入图片描述

其中蓝色为最新的数据,红色为老数据。然后mysql会维护一个事务集,如下:

在这里插入图片描述

然后mysql会从日志版本链的最新的数据开始向下遍历,这个例子先从上面第一个蓝色的开始,取出其事务ID为300,到事务集合中去比对,发现位于黄色的区域(即有可能还是未提交),然后判断是否在事务ID的read-view数组中(该数组前面说过是由活跃事务的ID数组以及最大已提交事务组成),目前由第一张事务的执行情况图我们可以看出,目前事务ID为1的read-view为[100,200],300构成,而300没在read-view的活跃数组中,所以300对数据进行的更改对事务1是可见的,所以日志版本链就不需要向下遍历了,查询的结果即为lilei300。

  1. 然后ID为100的事务又执行了两条更新语句,分别为update account set name = 'lilei1' where id = 1;update account set name = 'lilei2' where id = 1;,接着ID为1的事务再次执行了查询select name from account where id = 1;

同样从会滚日子链开始分析,蓝色同样为最新的数据,红色为老数据,目前的日子版本链的情况如下所示:

在这里插入图片描述

首先从最新的数据开始便利日志版本链,首先拿到ID为100的数据,比对事务集合,其同样落在黄色区域,然后事务ID1比较其readview,发现其落在了活跃数组[100,200]中(注意除非一些特殊情况ID为1的事务对数据进行了一些修改,其readview在整个过程中一般是不变的,虽然每次执行一次查询语句都会重新生成read-view),所以其对ID为1的事务是不可见的。然后接着向下遍历,知道遍历到ID为300的事务,发现其是可见的,所以查询到的数据同样是lilei300。后面的过程同样是按照这个过程分析。

mysql通过这个机制在RR隔离级别下实现了事务的可重复读而不用加锁。而在读已提交的情况下Mysql同样实现了MVCC机制,不同于RR级别,在读已提交的隔离级别下,每当一个事务被提交,其它事务相应的read-view会及时更新。

2. BufferPool缓存机制

InnoDB引擎SQL执行的BufferPool缓存机制如下所示:

在这里插入图片描述
对上图进行分析:

  1. 首先客户端执行sql语句update t set name='zhuge666' where id=1
  2. 然后经过连接器进行客户端的权限验证(判断该客户端是否有修改该条数据的权限)
  3. 然后通过分析器对sql语句进行词法分析
  4. 接着经过优化器来生成sql执行计划以及选择合适的索引
  5. 最后来到执行器开始真正执行sql(InnoDB层)
  • 首先InnoDB会将id为1的数据所在的页加载到BufferPool中
  • 然后将要更新的那条数据旧的值写入到undo日志中(用于后期会滚)
  • 然后更新BufferPool中的缓存数据
  • 然后将更新情况写入到redo日志缓存中
  • 客户端准备提交事务
  • 首先redo日志写入到磁盘
  • binlog(主要用于回复数据库磁盘中的数据)日志写入磁盘
  • 写入commit标记到redo日志文件中,提交事务完成,该标记为了保证事务提交后redo于binlog日志的一致性。
  • Mysql后台IO线程随机以page为单位将更新后的数据写入到磁盘

以上便是该sql语句执行的整个过程,但对于上面的过程可能还会存在下面这些问题:

  1. InnoDB体系结构是什么样子的?
    在这里插入图片描述
    InnoDB存储引擎有多个内存块,可以认为这些内存块共同组成了一个大的内存池,负责如下工作:
  • 维护所有进程/线程需要访问多个内部数据结构
  • 缓冲磁盘上的数据,方便快速读取(bufferPool),同时在对磁盘文件的数据修改之前在这里缓存
  • 重做日志缓存(redo.log)

后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存是最近的数据。此外将修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能够恢复到正常运行的状态。

  1. Mysql的bufferpool的组成?

在这里插入图片描述
3. Mysql是如何对缓冲池进行管理?

通常来说数据库中的缓冲池是通过LRU算法来进行管理的,即最频繁使用的页在LRU列表的前端,而最少使用的页在LRU列表的尾端。但InnoDB使用的并不是朴素的LRU算法,而是在LRU列表中加入了midpoint的位置,midpoint将LRU列表的数据页分为热数据和冷数据两部分。(这部分还是比较复杂的)

  1. rode日志的刷新时机?
  • Master Thread每一秒将重做日志缓存刷新到重做日志文件
  • 每个事务提交时会将重做日志缓存刷新到重做日志文件
  • 当重做日志缓存剩余空间下雨1/2时,重做日志缓存刷新到重做日志文件
  1. 为什么Mysql不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL了?

因为来一个请求就直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差。因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。 Mysql这套机制看起来复杂,但它可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性。 更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件。 正是通过这套机制,才能让我们的MySQL数据库在较高配置的机器上每秒可以抗下几千的读写请求。

相关文章:

MVCC和BufferPool缓存机制

文章目录 1. MVCC多版本并发控制机制2. BufferPool缓存机制 1. MVCC多版本并发控制机制 Mysql可以在可重复读隔离级别下可以保证事务较高的隔离性&#xff0c;这个隔离性是由MVCC机制来保证的&#xff0c;对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性&#…...

论文阅读笔记(Clover: 计算与存储被动分离的分布式键值存储系统)

关于Disaggregating Persistent Memory and Controlling Them Remotely: An Exploration of Passive Disaggregated Key-Value Stores这篇论文的笔记 原文链接 提出背景 传统的分布式存储系统中&#xff0c;每个节点都会包含计算和存储两个部分&#xff0c;一个节点既可以访…...

大模型推理框架概述

从 ChatGPT 面世以来&#xff0c;引领了大模型时代的变革&#xff0c;除了大模型遍地开花以外&#xff0c;承载大模型进行推理的框架也是层出不穷&#xff0c;大有百家争鸣的态势。本文主要针对业界知名度较高的一些大模型推理框架进行相应的概述。 简介 vLLM是一个开源的大模…...

抖音商品详情数据接口,抖音商品详情API接口

抖音商品详情API接口获取数据&#xff0c;接口对接可获取到商品标题&#xff0c;商品价格&#xff0c;商品优惠价&#xff0c;优惠券信息&#xff0c;店铺昵称&#xff0c;sku信息&#xff0c;sku主图&#xff0c;视频链接&#xff0c;详情主图&#xff0c;库存&#xff0c;数量…...

睿趣科技:抖音开网店怎么开通

在当前的数字时代&#xff0c;电子商务已经成为一种主流的商业模式。抖音作为中国最大的短视频平台&#xff0c;也提供了这种能力&#xff0c;让商家能够在平台上开设自己的网店。那么&#xff0c;如何在抖音上开通网店呢?下面是详细的步骤&#xff1a; 注册抖音账号 首先&…...

体育场馆能源消耗监测管理平台,为场馆提供能源服务

随着能源问题的不断重视&#xff0c;体育场馆能源问题也被人们广泛的关注。为了让体育场馆的能源高效利用&#xff0c;体育场馆能源消耗监测管理平台应用而生。 该平台通过采集、监测场内数据&#xff0c;并对数据进行实时分析与反馈&#xff0c;从而帮助管理者了解到场内能源…...

前端本地存储方案-localForage-vue3中使用

前言 前端有多种本地存储方案可供选择&#xff0c;常见的有&#xff1a; Cookie&#xff1a;小型的文本文件&#xff0c;存储少量数据Web Storage &#xff1a;包括&#xff1a;localStorage和sessionStorage&#xff0c;存储数据有上限&#xff08;5M&#xff09;左右Indexe…...

vivo年度新“机皇”X100系列要来了!

据供应链消息&#xff0c;vivo X90系列为满足旺盛的市场需求&#xff0c;曾经两次加单生产。 X90系列发布至今已超过11个月&#xff0c;竟然还保持着如此火爆大卖的状态,&#xff0c;令行业关注。而X系列即将发布的下一代产品X100系列&#xff0c;则让中高端消费者们更加期待。…...

滴滴发布十一大数据:延边出行需求上涨280% 西部省份成旅游热点

今年十一假期适逢中秋佳节&#xff0c;在亲友团聚和长假出游的多重期盼下&#xff0c;超级黄金周展现强劲内需&#xff0c;带动多样化的消费趋势&#xff0c;出行热情也随之高涨。滴滴出行数据显示&#xff0c;打车需求相比去年同期上涨80%&#xff0c;高峰时段每分钟呼叫突破1…...

Allegro如何查看器件的管脚号?

Allegro在默认情况下,器件是不显示管脚号的。 Allegro默认情况下,器件不显示管脚编号。 在PCB布局时,有时候我们需要看器件的管脚号,然后才能方便布局。那如何查看器件的管脚号呢? 这里介绍两种查看器件的管脚编号的方法。 方法一: (1)选择菜单Display→Color/Visi…...

苹果电脑用什么清理软件比较好?

很多人都会有这样的误解&#xff1a;mac系统不用清理。实际上mac只是将系统垃圾隐藏了&#xff0c;并且需要通过特定的方式打开。但其实在我们日常工作不用这么麻烦&#xff0c;我们只需用苹果电脑专业的清理软件就好了。今天小编就给大家分享一下mac用什么清理软件好 一、mac用…...

被装超市管理系统-智被装DW-S305系统组成项目背景

项目背景 被装管理是JD后勤管理的一个重要组成部分&#xff0c;现在的被装管理的手工方式已不能适应被装管理现代化的需求&#xff0c;存在诸多问题&#xff0c;还需要依托大量的人力物力&#xff0c;对于一些品规较多、出入库频率较高的仓库&#xff0c;这样的管理方式显得捉…...

使用“Apple 诊断”测试你的 Mac(查看电池是否到达更换标准)

使用“Apple 诊断”测试你的 Mac “Apple 诊断”&#xff08;以前称为“Apple Hardware Test”&#xff09;可以检查你的 Mac 是不是存在硬件问题。 如果你认为你的 Mac 可能存在硬件问题&#xff0c;可以使用“Apple 诊断”来帮助确定可能存在故障的硬件组件。“Apple 诊断”…...

ElementUI增删改的实现及表单验证

文章目录 一、准备二、添加功能2.1 新增添加按钮2.2 添加弹出框2.3 data中添加内容2.4 methods中添加相关方法 三、编辑功能3.1 表格中添加编辑和删除按钮3.2 methods中添加方法3.3 修改methods中clear方法3.4 修改methods中的handleSubmit方法 四、删除书籍功能4.1 往methods的…...

基于Google‘s FCM实现消息推送

当然&#xff0c;下面是一个简单的示例&#xff0c;演示了如何使用 Service Worker 和 Googles Firebase Cloud Messaging&#xff08;FCM&#xff09;来实现 Web 推送通知。 1. HTML 文件&#xff08;index.html&#xff09; <!DOCTYPE html> <html> <head&g…...

若依微服务前后端部署启动流程(只记录)

若依官网&#xff1a;https://www.ruoyi.vip/ 若依源码下载&#xff0c;直接zip既可&#xff1a;RuoYi-Cloud: &#x1f389; 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统&#xff0c;同时提供了 Vue3 的版本 下载解压&#xff0c;导入 idea&…...

docker创建nginx容器

前言&#xff1a;当直接run运行nginx容器时&#xff0c;如果命令带有-v 映射出配置文件目录&#xff0c;则会报错&#xff0c;提示无法初始化&#xff0c;原因是没有配置文件&#xff0c;docker会同步主机文件到容器内&#xff0c;而主机文件又是空白的&#xff0c;所以无法启动…...

nio 文件传输

transferto方法一次只能传输2个g的数据 文件大于2个g时...

2023-10-09 python-安装psd_tools-记录

摘要: 2023-10-09 python-安装psd_tools-记录 安装python3 yum install -y python3 yum install -y python3-devel psd-tools相关文档 psd-tools — psd-tools 1.9.28 documentation GitHub - psd-tools/psd-tools: Python package for reading Adobe Photoshop PSD files psd…...

【Python目标识别】目标检测的原理及常见模型的介绍

1 概述 目标检测&#xff08;Object Detection&#xff09;是计算机视觉领域的一个重要研究方向&#xff0c;其目的是在图像或视频中定位并识别出特定的物体。目标检测模型通常需要同时确定物体的位置和类别。在深度学习之前&#xff0c;目标检测算法主要基于传统计算机视觉方法…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...