MySQL内存模型与相关技术

MySQL实例的大概结构如下

如上图所示,InnoDB的存储引擎右多个内存块

  • 维护所有进程/线程需要访问多个内部数据结构
  • 缓存磁盘上的数据,方便快速读取,且修改的数据缓存在此,满了后统一写入磁盘
  • 重做日志(redo log)缓冲等等。

MySQL的线程们

MySQL的线程主要分为后台线程和主动线程,后台线程主要负责刷新内存池中的数据,保证缓冲中的数据是最近的数据。且将数据刷新到磁盘文件redo buffer。

1 Master Thread
  • 核心的后台线程。
  • 负责将缓冲池的数据异步刷新到磁盘,保证数据一致性。
  • 包括:脏页的刷新、合并插入缓冲、UNDO页的回收等。
2 IO Thread
  • 大量使用了AIO来处理IO请求。
  • 负责这些IO请求的回调处理。
  • 主要分为:write Thread,read Thread,insert buffer Thread,log IO Thread。
3 Purge Thread
  • 事务提交后,回滚日志就不需要了,PurgeThread回收已经使用并分配的undo页。
  • InnoDB 1.1后,purge操作就从Master Thread中单独使用PurgeThread来完成
  • 配置文件配置线程个数,即使大于1,也会被设置为1
    • 从InnoDB 1.2后,支持多个PurgeThread
4 Page Cleaner Thread
  • InnoDB 1.2.x中引入。
  • 将之前版本中脏页的刷新操作放入到这个线程中完成。

MySQL的内存结构和技术

缓冲池

缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
缓冲池存放的大多都是数据页,主要是为了加速数据页的访问

  • 缓冲池的大小影响数据库的整体性能–内存越大,算力越强,肯定性能越高。
  • 通过innodb_buffer_pool_size设置缓冲池的大小。
LRU List

缓冲池是使用LRU算法来进行管理页的,最频繁的页放在最前,最少访问的放在最后,当新加载页没有空间时,就可以释放最后的页。
LRU存放的页是压缩的页,当要使用时会放到unzip_LRU中解压后缓存

页大小默认为16KB,InnoDB的LRU算法加入了midpoint(理解为中点),定位在LRU列表的5/8处。midpoint后称为old列表,之前为new列表(热点数据),且新读的页不一定是热点数据。

unzip_LRU

压缩LRU页主要是存放已经解压的数据页,存放在内存中,可以说数据页存放的主要位置就在这里

  • 压缩页,unzip_LRU如何分配内存的
    • 检查4KB的unzip_LRU列表,检查是否有可用的空闲页;
      • 若有,则直接使用;
    • 否则没有4kb的,则检查8KB的unzip_LRU列表;
      • 若能够得到8KB空闲页,将页分成2个4KB页,存放到4KB的unzip_LRU列表;
    • 若不能得到空闲页,从LRU列表中申请一个16KB的页,将页分为1个8KB的页、2个4KB的页,分别存放到对应的unzip_LRU列表中。
Flush list

页中的数据被修改的就是脏页,因为内存和磁盘的页的内容不一致。此时会通过 脏页刷新(Dirty Page Flush) 将脏页复制一份到Flush list中,等待CHECKPOINT机制刷新回磁盘,LRU中的脏页不会删,因为Flush刷新回磁盘后,脏页就不是脏页了。

Free List

Free List也是在InnoDB缓冲池中管理的,用于存储可用的空闲页。当需要新的页时,InnoDB会从Free List中获取空闲页,避免频繁申请新的内存空间。

重做日志缓冲

redo log buffer,作用就是包装数据的一致性,相比于Flush列表的刷新,redo log buffer更加准时和及时,一般1秒进行一次刷新。

  • Master Thread每一秒将redo log buffer刷新到重做日志文件中。
  • 事务提交时会将redo log buffer刷新
  • redo log buffer空间小于1/2时,会刷新
插入缓冲区 Insert Buffer

对于非聚集索引(非主键索引)插入操作时,不能直接根据索引找到插入的位置,为了提高插入性能(减少磁盘I/O),将数据首先写入到Insert Buffer中的页内存中。
然后,在后台的线程或特定的检查点时刻,InnoDB会将Insert Buffer中的数据异步地刷回到磁盘页中。这个过程被称为"插入缓冲合并"(Insert Buffer Merge)。

插入缓冲区会根据不同的索引(不同表)来划分区域

变更缓冲区 change buffer

和插入缓冲区类似,只不过是维护修改和删除等操作的缓冲区,并且刷盘时合并操作

Merge Insert Buffer

存放着Insert Buffer中待合并的数据,用于在适当的时候将插入缓冲区(Insert Buffer)中的数据合并写入到相应的索引页中。

两次写

  1. 执行数据修改操作时,首先将要修改的数据页复制一份到内存中的一个特殊缓冲区,即 doublewrite buffer(双写缓冲区)。这个特殊缓冲区被视为内存中的一个临时存储区域。
  2. 接下来,InnoDB将数据页更新写入磁盘的两个位置:
    • 首先,将数据页的副本写入由操作系统管理的磁盘空间上的一个位置。
    • 然后,将相同的副本写入 doublewrite buffer 中的另一个位置。
  3. 只有在这两个位置都写入成功后,InnoDB才会将对应的事务标记为“已提交”。这确保了双写操作的原子性和一致性。
  4. 在数据库崩溃或断电等系统故障发生时,InnoDB可以从 doublewrite buffer 中恢复数据页,以确保数据的完整性。如果某个位置的磁盘页损坏或数据不一致,InnoDB可以使用 doublewrite buffer 中的备份来修复破损的页,避免数据丢失。

主线程的工作

InnoDB的主线程Master Thread具有最高的线程优先级,由主循环,后台循环,刷新循环,暂停循环组成。会根据数据库运行状态在多个循环之间切换

CheckPoint技术–Flush列表中的脏页刷新到磁盘的一个机制

对于InnoDB存储引擎而言,其是通过LSN(Log Sequence Number)来标记版本的。而LSN是8字节的数字,其单位是字节。每个页有LSN,重做日志中也有LSN,Checkpoint也有LSN,LSN也是宕机后恢复数据和检查事务的关键

cp = CheckPoint
作用

  • 缩短数据库的恢复时间:redo日志中cp之前的内容为已经从内存刷入磁盘,cp之后的内容就表示没有刷入,当数据库宕机重启后,读取cp后的内容,所以可以缩短恢复时间。
  • 缓冲池不够用时,将脏页刷新到磁盘:LRU需要保证100个空闲页使用,不够时会将冷页丢弃,如果这个冷页同时是脏页,就需要进行刷入磁盘
  • 重做日志不可用时,刷新脏页:当redo log容量不够用时,可以进行cp,将脏页刷入磁盘,此时重做日志中的日志就可以标记为可丢弃(因为内容已经刷入磁盘,已经持久化)

分类

  • Sharp CheckPoint:当数据库关闭时就需要将内存中的所有脏页刷新回磁盘。并不适用于正常运行时,因为每次刷新都会有大量数据IO。
  • Master Thread CheckPoint:每隔1秒或10秒将脏页列表的一定比例的页刷入磁盘。是异步操作,不会阻塞用户线程。
  • flush_lru_list Checkpoint:LRU需要保证100个空闲页的大小以供使用
  • Async/Sync Flush Checkpoint:当重做日志不够用的情况下的CheckPoint
  • Dirty Page too much:脏页的数量太多,导致InnoDB存储引擎强制进行Checkpoint。其目的总的来说还是为了保证缓冲池中有足够可用的页

LSN

  • Log Sequence Number的缩写,代表日志的序列号,占用8字节且单调递增
  • 有以下含意:重做日志写入的总量、checkpoint的位置、页的版本
  • 页的头部,有一个FIL_PAGE_LSN,记录了该页的LSN,表示该页最后刷新时LSN的大小(用来判断页是否需要进行恢复操作)
    • 例如:页P1的LSN为10000,而数据库启动时,InnoDB检测到写入重做日志中的LSN为13 000,并且该事务已经提交,那么数据库需要进行恢复操作,将重做日志应用到P1页中。同样的,对于重做日志中LSN小于P1页的LSN,不需要进行重做,因为P1页中的LSN表示页已经被刷新到该位置

当LSN用于恢复数据时有如下操作:找到cp位置之后的日志部分,因为cp之前的数据是刷入磁盘了的,检查之后的日志部分涉及的页进行恢复——>cp的LSN为10000时发生宕机,恢复操作仅恢复LSN 10 000之后的日志

其他技术

自适应hash索引——可以手动创建了

  • 自适应哈希索引是根据实际的数据访问模式来动态创建和维护的。
    • 当某个索引被频繁访问时,InnoDB会自动将其部分数据构建成哈希索引,以提高查询性能。
  • 这种自适应的特性无需手动创建和管理哈希索引
    • 而是让InnoDB根据实际的数据访问情况来决定是否创建哈希索引,从而简化了索引的管理工作。
  • 可以不用为了某个索引单独创建一个hash索引,innodb会自动帮我们为热点数据创建hash索引,所以称为自适应hash索引,自适应是因为是innodb会根据我们的热点数据区创建hash索引

AIO

非阻塞IO,当向mysql发送请求时,不会被阻塞,可以连续发送IO操作,并且innodb会进行IO merge通过判断我们要查询的页是否时连续的,来进行mergeIO操作,比如读取(8,6),(8,7),(8,8)会进行合并读取(8,6)连续读取48kb的数据。innodb的AIO需要操作系统提供支持,也就是硬件支撑。

刷新临接页

Flush Neighbor Page(刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。这样做的好处显而易见,通过AIO可以将多个IO写入操作合并为一个IO操作,故该工作机制在传统机械磁盘下有着显著的优势。
但是可能会有以下问题:

  1. 是不是可能将不怎么脏的页进行了写入,而该页之后又会很快变成脏页?
  2. 固态硬盘有着较高的IOPS,是否还需要这个特性?

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

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

相关文章

5.3 需求分析

需求分析 软件需求定义分类练习题 需求工程需求获取练习题 需求分析状态转化图数据流图DFD顶层数据流图0层数据流图1层数据流图 练习题 需求规约需求定义方法 需求验证需求管理版本控制需求跟踪变更控制练习题 考试大概3分 软件需求 定义 软件需求:是指用户对目标…

【QT常用技术讲解】tableWidget右键菜单及多进程编程

前言 本文在QT项目的开发框架的基础上(源代码)增加tableWidget的右键菜单功能,并使用进程实现ping计算机的功能来讲解,本文不对进程间通信进行讲解。 概述 一个项目在开发过程中,通常面临着引入“第三方应用”&#x…

春秋云境 | 文件上传 | CVE-2022-30887

目录 靶标介绍 开启靶场 上传一句话木马 蚁剑连接 找到 flag 靶标介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口,客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0…

【代码随想录训练营第42期 Day22打卡 回溯Part1 - LeetCode 77. 组合 216.组合总和III 17.电话号码的字母组合

目录 一、做题心得 二、回溯基础知识 1.定义 2.适用问题 3.一个思想 4.代码实现 三、题目与题解 题目一:77. 组合 题目链接 题解:回溯 题目二:216.组合总和III 题目链接 题解:回溯 题目三:17.电话号码的字…

第十九天(2024.8.7)Vue Element-plus

1.Vue 1.创建vue文件 1.创建一个文件夹来存储vue文件 我在D盘下创建了一个EasyVue文件夹来存储vue文件 2.在控制台中输入 如果在控制台中按下面步骤成功不了的话,尝试:1.用管理员身份运行控制台 2.关闭防火墙 3.打开编码工具(Visual St…

WPF学习(5)- Border控件(边框布局)+GridSplitter分割窗口

严格来说,Border并不是一个布局控件,因为它并不是Panel的子类,而是Decorator装饰器的子类,而Decorator继承于FrameworkElement。我们要先看看它的父类Decorator。 public class Decorator : FrameworkElement, IAddChild {public…

CUDA编程05 - GPU内存架构和数据局部性

一:概述 到目前为止,我们已经学会了如何编写 CUDA 核函数,以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构,以及线程在硬件上调度执行过程。在本章中,我们将重点关注 GPU 的片上(on-chi…

Redisson 实现分布式锁

文章目录 Redisson 是什么Redisson 使用客户端模式单节点模式哨兵模式主从模式集群模式Spring Boot 整合 Redisson 中的锁Redisson 可重入锁Redisson 公平锁Redisson 联锁Redisson 读写锁Redisson Redlock Redisson 的看门狗机制RedLock 解决单体故障问题如何使用 RedLockMarti…

【C语言篇】操作符详解(上篇)

文章目录 操作符详解(上篇)前言sizeof强制类型转换算术操作符赋值操作符逻辑操作符逻辑取反运算符逻辑与运算符逻辑或运算符 关系操作符自增自减操作符和-逗号表达式 操作符详解(上篇) 前言 操作符又被叫做运算符,是不…

进程状态(三)----- linux 中具体的进程状态(下)

目录 前言1. T && t 状态2. X 与 Z 状态3. 孤儿进程 前言 继上一篇文章 进程状态(二)----- linux 中具体的进程状态(上) 介绍了 linux 系统中具体的 R、S、D 状态,而这篇文章继续介绍 linux 系统中剩下的三种…

SpringBoot简单项目(二维码扫描)

pom.xml中导入依赖 <!-- zxing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</gro…

探索七款前沿UI设计软件:创新与实践

之前我们分享了制作原型的有用工具。制作完原型后&#xff0c;我们需要优化界面&#xff0c;这就是 UI 设计师的任务了。UI 设计软件对设计师来说非常重要。UI 设计工具的使用是否直接影响到最终结果的质量&#xff0c;所以有人会问&#xff1a;UI 界面设计使用什么软件&#x…

Java批量查询CSDN质量分

文章目录 前言代码实现pom.xml实体类工具类质量分查询 效果开源仓库 前言 在CSDN平台申请“专家博主”、“优质创作者”等称号的时候&#xff0c;往往会对博客的质量分有一定的要求&#xff0c;这时候我们需要审视以往所发表的博客&#xff0c;找出质量分较低的博客&#xff0…

nordic 蓝牙ble 配对绑定的流程 原理

目录 配对和绑定的基本概念 配对和绑定的流程 1. 配对请求和响应 2. 配对方法选择 3. 密钥生成和交换 4. 配对完成和绑定 配对和绑定的代码实现 初始化Peer Manager 处理Peer Manager事件 处理BLE事件 启动广播 在Nordic芯片上实现蓝牙低功耗(BLE)设备的配对和绑定…

Python 为Excel单元格设置填充\背景色 (纯色、渐变、图案)

在使用Excel进行数据处理和分析时&#xff0c;对特定单元格进行背景颜色填充不仅能够提升工作表的视觉吸引力&#xff0c;还能帮助用户快速识别和区分不同类别的数据&#xff0c;增强数据的可读性和理解性。 本文将通过以下三个示例详细介绍如何使用Python在Excel中设置不同的单…

sql注入——sqlilabs1-15

目录 sql注入靶场练习--sqlilabs 1.less-1​编辑 1.测试发现单引号为逃逸符号 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.查询用户表的列名字 6.查询用户信息 2.less-2​编辑 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.…

机械学习—零基础学习日志(高数23——无穷小运算)

零基础为了学人工智能&#xff0c;真的开始复习高数 这段时间&#xff0c;把张宇老师讲解考研的第一部分基本全部学习完毕了。 这里把第一部分的内容最后汇总一下。 无穷小运算——吸收律 这里展示一些无穷小的具体计算思路 无穷小运算——计算方法 泰勒展开的原则 夹逼准则…

SQL报错注入之floor

目录 1.简述 2.关键函数说明 1.rand函数 2.floor&#xff08;rand&#xff08;0&#xff09;*2&#xff09;函数 3.group by 函数 4.count&#xff08;*&#xff09;函数 3.报错分析 4.报错流程 4.1寻找注入点 4.2爆数据库名 4.3爆表名 4.4爆字段名 4.5查询数据 1.…

PySide入门实战之五 | 信号与槽函数之鼠标、键盘等事件

&#x1f680;&#x1f680;&#x1f680; Pyside6实战教程专栏目录入口&#xff1a;点击跳转 目录 一、前期准备二、鼠标触发事件鼠标拖动窗口 一、前期准备 我们采用Pyside入门实战之四中通过QTDesigner创建的界面&#xff0c;具体由两个Label和一个Button组件构成&#xff…

【c++】基础知识——快速入门c++

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…