Mysql高级部分学习笔记(二)——事务锁

news2024/12/24 20:55:34

一、buffer pool

1.1 缓冲池(buffer pool)

  • 简介:InnoDB是基于磁盘存储的,并将其中的数据按页的方式进行管理。因此InnoDB可视为基于磁盘的数据库系统。由于CPU的速度和磁盘IO速度的巨大鸿沟,需要**缓冲池(buffer pool)**来提高数据库的整体性能
  • 作用:为了提高大容量读取操作的效率,缓冲池被分为多个页,这些页可能包含多个行。为了提高缓存管理的效率,缓冲池被实现为页的链接列表。使用LRU算法的变体将很少使用的数据从缓存中老化掉 。
  • 架构:

在这里插入图片描述

  • 原理

    • 第一次读取数据时,首先从磁盘中读取数据页,并放到(FIX)缓冲池中。
    • 再次读取同样的数据时,先看缓冲池中是否有相同的数据页。有则命中,从缓冲池中读取。否则从磁盘读取
  • 缓存页数据结构

    缓存页都会对应着一个描述数据块,里面包含数据页所属的表空间、数据页的编号,缓存页在 Buffer Pool 中的地址等等。

    描述数据块本身也是一块数据,它的大小大概是缓存页大小的5%左右,大概800个字节左右的大小。

1.2 buffer pool的缓存结构

每个 Buffer Pool 负责管理着自己的描述数据块和缓存页,有自己独立一套 free 链表、flush 链表和 lru 链表。

上面我们知道缓冲池被设计为页的链表结构根据页的不同状态(未使用,已使用,已经使用未刷新到缓存):

  • FREE链表: 空闲列表,页属于缓存池但是并没有缓存mysql数据(查询出来的数据会使用该链表的节点存储数据并从free链表移除 进入到LRU链表)。
  • FLUSH链表: LRU列表中的数据一旦被修改(和磁盘不一致),则该页被标记为flush链表中的一员。
  • LRU链表: 采用最近最久未使用LRU的变种(新增了midPoint)内存淘汰策略。
  • 在这里插入图片描述

1.2.1 LRU list

基于LRU(最近最久未使用)内存淘汰策略并新增了midPoint位置。新读取到的页并没有直接放在LRU列的首部,而是放在距离尾部37%的位置。这个算法称之为midpoint insertion stategy

1.2.2 Free list

双向链表,链表的每个节点就是一个个空闲的缓存页对应的描述数据块。由 Buffer Pool 里的描述数据块组成的,你可以认为是每个描述数据块里都有两个指针,一个是 free_pre 指针,一个是 free_next 指针,分别指向自己的上一个 free 链表的节点,以及下一个 free 链表的节点。

free 链表有一个基础节点,他会引用链表的头节点和尾节点,里面还存储了链表中有多少个描述数据块的节点,也就是有多少个空闲的缓存页。

1.2.3 Flush list

Buffer Pool 中的缓存页因为不断被修改而导致和磁盘文件中的数据不一致了会有很多个脏页,脏页里面很多脏数据。所以,MySQL 会有一条后台线程,定时地将 Buffer Pool 中的脏页刷回到磁盘文件中。

1.3 Buffer Pool 高并发场景

单个 Buffer Pool 的问题

如果 InnoDB 存储引擎只有一个 Buffer Pool,当高并发时,多个请求进来,那么为了保证数据的一致性(缓存页、free 链表、flush 链表、lru 链表等多种操作),必须得给缓冲池加锁了,每一时刻只能有一个请求获得锁去操作 Buffer Pool,其他请求只能排队等待锁释放。那么此时 MySQL 的性能是多么的低!

多个 Buffer Pool

在生产环境中,其实我们是可以给 MySQL 设置多个 Buffer Pool 来提升 MySQL 的并发能力的

如果Buffer Pool 分配的内存小于1GB,那么最多就只会给你一个 Buffer Pool。

但是呢,如果你给 MySQL 设置的内存很大,此时你可以利用下面两个参数来设置 Buffer Pool 的总大小和总实例数,这样,MySQL 就能有多个 Buffer Pool 来支撑高并发了。

二、Mysql持久性的实现

2.1、持久性的定义

事务一旦提交,则其所有的修改将会保存到数据库当中。即使此时系统崩溃,修改的数据也不会丢失。同时数据库连接中,默认有一个参数autocommit=1(如果想要关掉,要set autocommit=0,然后要手动的开启关闭),表示每次执行一条sql如果没有显示启动事务语句(begin或start transaction)就会隐试的开启一个事务

redo log 和 undo log 都属于InnoDB的事务日志。

  • redo log是用来恢复数据的,用于保障已提交事务的持久性;
  • undo log是用来回滚事务的,用于保障未提交事务的原子性。

2.2 redo log(重做日志) 如何保证事务的持久性?

InnoDB作为MySQL的存储引擎,数据是存放在磁盘中的,但如果每次读写数据都需要磁盘IO,效率会很低。为此,InnoDB提供了缓存(Buffer Pool),Buffer Pool中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool中读取,如果Buffer Pool中没有,则从磁盘读取后放入Buffer Pool;当向数据库写入数据时,会首先写入Buffer Pool,Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏)。
Buffer Pool的使用大大提高了读写数据的效率,但是也带了新的问题:如果MySQL宕机,而此时Buffer Pool中修改的数据还没有刷新到磁盘,就会导致数据的丢失,事务的持久性无法保证。

于是,redo log 被引入来解决这个问题:当数据修改时,除了修改Buffer Pool中的数据,还会在 redo log 记录这次操作;当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。

在这里插入图片描述

既然 redo log 也需要在事务提交时将日志写入磁盘,为什么它比直接将Buffer Pool中修改的数据写入磁盘(即刷脏)要快呢?

  1. 刷脏是随机IO,因为每次修改的数据位置随机,但写redo log是追加操作,属于顺序IO
  2. 刷脏是以数据页(Page)为单位的,MySQL默认页大小是16KB,一个Page上一个小修改都要整页写入;而redo log中只包含真正需要写入的部分,无效IO大大减少

MySQL会根据redo log自动在系统空闲时完成更新磁盘数据页的操作, 这个过程也叫做刷盘, 会对MySQL性能有一定影响

你对数据页的修改都记录在redo log了, 宕机了根据redo log的内容恢复就好, 默认设置下事务只要提交就会持久化到磁盘文件redo log中。

redo log持久化策略

在这里插入图片描述

2.3 undo log(回滚日志) 如何来保证事务的原子性?

原子性指的是事务中的所有操作是一个不可分割的整体, 要么全做, 要么全不做.

利用Innodb引擎的undo log(回滚日志),它记录了回滚一个操作必需的内容

比如,当你update一条数据的时候,就需要这条记录的原始值,回滚的时候,把这条记录再update为原始值

这样,当事务执行失败,就可以根据undo log回滚之前执行成功的操作。

在这里插入图片描述

InnoDB实现回滚,靠的是undo log:当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

undo log 属于逻辑日志,它记录的是sql执行相关的信息。可以简单的理解为:当insert一条记录时,undo log会记录一条对应的delete语句;当update一条语句时,undo log记录的是一条与之操作相反的语句。当事务需要回滚时,可以从undo log中找到相应的内容进行回滚操作,回滚后数据恢复到操作之前的状态。

2.4 redo log与binlog的区别

redo log又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来
binlog(主要用于集群、主从)记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。然后,若操作本身并没有导致数据库发生变化,那么该操作也会写入二进制日志。

2.5 checkpoint机制

checkpoint触发的时候,主要干两件事:

  1. 将Buffer Pool中的脏页刷新到磁盘上
  2. 将对应的脏页信息和活跃事务信息写入到red olog日志中

checkpoint有以下好处:

  1. 可以缩短数据库的恢复时间
  2. 当buffer pool中的内存不够用时,刷新脏页到磁盘中
  3. 当redolog file不够用时,将脏页刷新到磁盘中

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

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

相关文章

windows下通过uiAutomation技术获取ui元素

最近接个需求,要求获取 windows 下 ui 元素,经一番搜索后了解到可通过工具 UISpy.exe 或 inspect.exe 来进行查看。以软件 davinci resolve 为例: 右侧即 UISpy 工具,根据内容可以看出已捕获到 davinci 界面的各属性及对应值。而 …

ItextPdf 字体显示差异分析与处理

ItextPdf 同span下字体显示差异分析与处理 在文章itext7 字体问题解答与相应源代码分析 中是分析了框架的字体设置与相关代码,在本篇文章里将对其生效效果进行分析和相关问题进行处理(可持续更新,问题请留言) 问题一 问题说明&…

将无风险资产与两种风险资产进行组合

目录 最优风险资产组合。 计算权重的公式。 应用。 最优风险资产组合。 曲线 AB 是两种风险资产的权衡取舍线。 A 点为资产组合中仅有风险资产 1 的情况。将 O 点与 A 点相连,便得到无风险资产与单个风险资产的权衡取舍线。 实际上,曲线 AB 上任一点…

【青训营】分布式理论初探

本文内容总结自 字节跳动青年训练营 第五届后端组 分布式理论初探 一、概述 分布式系统是计算机程序的集合,这些程序利用横跨多个独立计算节点的计算资源实现共同目标,可分为分布式计算、分布式存储、分布式数据库。 其优势是:去中心化、…

ESP32设备驱动-TEA5767收音机模块驱动

TEA5767收音机模块驱动 1、TEA5767介绍 TEA5767HN 是一款用于低压应用的单芯片电子调谐 FM 立体声收音机,具有完全集成的中频 (IF) 选择性和解调功能,频率范围从76—108MHZ自动数字调谐。 该收音机完全无需调整,高灵敏度,高稳定性,低噪音,收音模块。只需要最少的小型低…

Win10安装MySQL、Pycharm连接Mysql、Pycharm中运行django

目录 一、windows系统mysql相关操作 1、检查当前系统是否已安装mysql 1. 按win r 键(调出运行窗口) 2. 输入service.msc,点击[ 确定 】 3.打开服务列表 - 检查是否有mysql服务 2、windows安装mysql 1.下载mysql 2. 解压 mysql 到自己…

【面试题:三个线程轮流打印A ,B,C】

面试题:三个线程轮流打印A ,B,C面试介绍说明思考方案代码实现Print 打印基类APrint 打印字符A 线程CPrint 打印字符C 线程PrintConstant 常量类StrRun 启动类测试结果总结面试介绍说明 当时是2022 年3月 在深圳面试的一家公司。由于疫情比较…

内网渗透(三)之基础知识-域环境的介绍和优点

系列文章 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 域介绍 域的介绍 Windows域是计算机网络的一种形式&#…

DMTet 阅读笔记

介绍 主页 https://nv-tlabs.github.io/DMTet/论文pdf https://nv-tlabs.github.io/DMTet/assets/dmtet.pdf视频汇报 https://slideslive.com/38967642/deep-marching-tetrahedra-a-hybrid-representation-for-highresolution-3d-shape-synthesis?refhomepage疑似代码 在nvdi…

【手写 Promise 源码】第十八篇 - EventLoop 简介

theme: fancy 一,前言 近期公司项目比较忙,粘了老博客几篇 Spring 源码来充数,周末腾出时间把 Promise 做个收尾; 在开始 EventLoop 前,我对 Promise 源码部分进行了简单回顾,并更新了【Promise 源码学习…

【链表面试题】解决环形链表和相交链表问题

在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针…

限期出国|CSC资助赴世界top50名校英国曼彻斯特大学访学

我们先为J老师40天获得佐治亚理工学院(美国三大理工学院之一)的访问学者邀请函,又成功申报CSC。后因其担心被美国拒签要求重新申请英国名校,10天后拿到跻身世界top50英国曼彻斯特大学的offer,后经ATAS审批、CSC改派、使…

linux基本功系列-help命令实战

文章目录前言🚀🚀🚀一. help命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示某个命令的帮助信息3.2 查看某个命令的简述3.3 以伪man手册格式输出cd信息四. windows中的help总结前言🚀🚀🚀 想要学好Lin…

车载网络 - Autosar网络管理 - 基本概念

Autosar作为当前车载行业使用最为广泛的一种汽车开发系统架构,网上也有很多相关的介绍;不过我看很多有完整的来讲一下这个规范的,一般都是只讲了其中一部分,我这就准备搞出来一套完整版本的Autosar网络管理的规范、测试设计、自动…

新C++(7):多态那些事儿_下

"当人类悬浮到腐朽,有谁愿追随彗星漂流哦~"一、多态原理(1)虚函数表指针(虚表指针)紧接上一篇sizeof(Base)这一小段说起。class Base1 { public:void func(){} private:int _a; };class Base2 { public:virtual void func() {} private:int _a; };我们知道…

【我刚毕业,学习Java开发工程师能学会吗?没有基础?】

对于Java专业来说,学历还是有一定的要求。一般都是本科学历,至少也有个大专,其次就是年龄越年轻越好。现在转行Java的年轻人很多,学历这方面越高越有竞争力一些,尤其是在后期的职业晋升阶段。如果想走管理路线&#xf…

耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

闲话少说,直上狠货。 1、有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍。5大文稿类型,让记录得心应手,随时进行创…

第十四章 集合(Set)

一、Set 接口(P518) 1. Set接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个 null 2. Set接口的常用方法 和 …

SpringBoot中MQ使用

本文记录学习在Spring Boot中使用MQ。一 什么是MQMQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。它的作用类似于邮局,发信人(生产者)只需要将信(消息)交给邮局,然后由邮局再将信(消息)发送给具体的接收者…

博途1200PLC/1500PLCMODBUS从站通信应用

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…