【MySQL进阶之路】BufferPool底层设计(下)

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

在这里插入图片描述

什么时间将缓存页刷入磁盘呢?

在 MySQL 中会有一个后台线程运行定时任务,定时将 LRU 链表的 冷数据区域尾部 的一些缓存页刷入磁盘里去,清空这几个缓存页,将他们加入到 free 链表中(free 链表存放的就是 BufferPool 中的空缓存页的地址)

并且这个后台线程也会在 MySQL 空闲时,将 flush 链表(flush 链表存放的是 BufferPool 中被修改过的缓存页,也称为脏页,脏页都是需要刷回磁盘的)中的缓存页都刷入磁盘中

在 BufferPool 中存储的是什么数据呢?

我们在 MySQL 中看到的数据是一个一个的表,表中有一行一行的数据

那么难道 BufferPool 中存储的是一行一行的数据吗?

肯定不是的,我们可以来思考一下,如果 BufferPool 存储一行一行的数据,那么每次一修改数据时,都需要去磁盘中读取一行数据到 BufferPool 中,而磁盘 IO 是很慢的,一次磁盘 IO 只读取一行数据显然不划算!

所以,在 MySQL 的设计中, BufferPool 存储的其实是 数据页

MySQL 中将很多行的数据放在一个数据页中,当数据在磁盘文件中存储的时候,就是存储的很多数据页:

请添加图片描述

当数据页进入到 BufferPool 之后,除了数据页之外,每个缓存也还会有对应的描述数据,存储一些数据页的信息,BufferPool 默认大小是 128MB,而数据页大小是 16KB,缓存页大小与数据页大小是相等的,如下:

请添加图片描述

BufferPool 中缓存页的管理(free、flush链表)

MySQL 在启动的时候,就会在内存区域中初始化 BufferPool,此时 BufferPool 中会直接划分出一个一个的缓存页,初始时所有的缓存也都为空

那么 BufferPool 如何来管理这些缓存页呢,怎么知道哪些缓存页是空的?(free 链表)

BufferPool 通过 free 链表来管理空的缓存页,是一个双向链表,由缓存页的描述数据组成,里边有一个 基础节点 ,可以通过基础节点快速找到开始节点和结束节点,并且基础节点中记录了 free 链表的总节点数:

请添加图片描述

flush 链表

当缓存页中数据被修改之后,这个缓存页就变为了脏页,这些脏页此时和磁盘中的数据是不一致的,因此称为 脏页

这些脏页就是由 BufferPool 中的 flush 链表来管理的,flush 链表和 free 链表结构一样,都是双向链表

请添加图片描述

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

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

相关文章

Linux运用fork函数创建进程

fork函数: 函数原型: pid_t fork(void); 父进程调用fork函数创建一个子进程,子进程的用户区父进程的用户区完全一样,但是内核区不完全一样;如父进程的PID和子进程的PID不一样。 返回值: RETURN VALUEO…

压敏电阻简介

压敏电阻 原理 压敏电阻器是一种具有瞬态电压抑制功能的元件,可以用来代替瞬态抑制二极管、齐纳二极管和电容器的组合。压敏电阻器可以对IC及其它设备的电路进行保护,防止因静电放电、浪涌及其它瞬态电流(如雷击等)而造成对它们…

C++服务器端开发(11):测试和部署

编写服务器代码:使用C编写服务器程序。根据服务器的需求,可以选择使用现有的网络库(例如Boost.Asio)或者自己编写网络通信代码。 编写测试代码:编写测试代码来验证服务器的功能和性能。可以使用单元测试框架&#xff…

node网站 宝塔 面板配置 防止刷新404

1.问题 我现在配置了一个网站 后台项目 放到了宝塔上 将相应的域名和项目都配置好了 域名也可以访问 但是有的时候 出现了404 类似这种404 这个资源找不到 2.说明 其实这个问题的原因是nginx 的问题 反向代理的原因 3.解决 在这个配置文件中 有个配置文件 # 防止刷新404l…

前端使用pdf.js进行pdf文件预览的第二种方式:Viewer.html

背景 最近需要实现一个PDF文档预览的功能&#xff0c;按理说&#xff0c;如果只是简单的预览&#xff0c;使用<embed>、<object>等就可以实现。 但是&#xff0c;我们的需求要实现搜索&#xff01;而且&#xff0c;文档还都超大&#xff0c;均300页以上。那<e…

斯巴鲁Subaru EDI需求分析

斯巴鲁Subaru是日本运输集团斯巴鲁公司&#xff08;前身为富士重工&#xff09;的汽车制造部门&#xff0c;以性能而闻名&#xff0c;曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接&#xff0c;首先需要确…

bug fix:微信小程序从搜索栏搜索进入不触发onLaunch事件

最近遇到一个棘手的问题&#xff0c;发现一个诡异的 bug。经过深入排查&#xff0c;最终定位到问题出在小程序从微信小程序的搜索栏搜索进入时未触发 onLaunch 事件。 用户进入小程序时&#xff0c;会进行身份判断。对于特定身份&#xff0c;用户不会停留在首页&#xff0c;而…

Python无人自动驾驶无人信号灯

Python无人自动驾驶无人信号灯全套系统的重要性如下&#xff1a; 安全性&#xff1a;无人自动驾驶车辆需要准确地识别和理解交通信号灯&#xff0c;以便正确执行相应的操作。基于Python的无人信号灯系统可以使用计算机视觉技术来检测和识别信号灯&#xff0c;确保车辆能够正确地…

Vue ECharts 散点图上画一个圆形 - 附完整示例

ECharts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可…

Redis 单线程

文章目录 Redis单线程架构Redis 单线程访问速度IO多路复用原理 Redis单线程架构 Redis的单线程架构的效果为&#xff1a;Redis的单线程是对于服务端而言的&#xff0c;Redis允许多个Redis用户端同时在线操作&#xff0c;但同时只有一个用户端在和服务端交互。多个用户同时发送…

《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)

文章目录 5.1 交互式暂存5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;为 Python 项目分阶段提交5.1.3 拓展案例 1&#xff1a;细粒度控制更改5.1.4 拓展案例 2&#xff1a;处理遗漏的更改 5.2 使用 Rebase 优化提交历史5.2.1 基础知识讲解5.2.2 重点案例&#xff1a;整理 Pyt…

【工作学习 day04】 9. uniapp 页面和组件的生命周期

问题描述 uniapp常用的有&#xff1a;页面和组件&#xff0c;并且页面和组件各自有各自的生命周期函数&#xff0c;那么在页面/组件请求数据时&#xff0c;是用created呢&#xff0c;还是用onLoad呢&#xff1f; 先说结论: 组件使用组件的生命周期&#xff0c;页面使用页面的…

通俗易懂:快速排序算法全解析

快速排序&#xff08;Quick Sort&#xff09;是一种高效的分治排序算法&#xff0c;它以其出色的性能和广泛的应用而闻名。本文将深入讲解快速排序的原理、步骤和时间复杂度&#xff0c;并探讨其优势和应用场景。 快速排序原理 快速排序的核心思想是通过选择一个基准元素&…

(delphi11最新学习资料) Object Pascal 学习笔记---第4章第2.5节(重载和模糊调用)

4.2.5 重载和模糊调用 ​ 当调用一个重载的函数时&#xff0c;编译器通常会找到匹配的版本并正确工作&#xff0c;或者如果没有任何重载版本具有正确匹配的参数&#xff08;正如我们刚刚看到的&#xff09;&#xff0c;则会报出错误。 ​ 但还有第三种情况&#xff1a;假设编…

Go语言每日一练——链表篇(四)

传送门 牛客面试笔试必刷101题 ----------------合并两个排序的链表 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

ClickHouse表常用引擎

1 TinyLog 特点&#xff1a; 是最简单的表轻量引擎&#xff08;最多约100万行&#xff09;, 一写多读的应用场景。同时读写会损害数据&#xff1b;TinyLog 表经常作为中间表&#xff0c;用于数据的微批量处理. 语法中无需携带任何参数&#xff1b;它将数据保存到磁盘. 每个字段…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(2)

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

Sqlite3安装步骤

1、Sqlite3以下载文件&#xff0c;配置环境变量的方式进行安装。 2、下方链接为官方的下载地址。 sqlite下载地址 2.1、需要两个下载文件&#xff0c;解压后将他们放在一起&#xff0c;假设解压后的路径为E:\sqlite。 sqlite-dll-win-x64-3450100.zip sqlite-tools-win-x6…

【数据结构】数据结构

本文是基于中国MOOC平台上&#xff0c;华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记&#xff0c;便于后期讲行系统性查阅和复习。 从个人感受而言&#xff0c;华中科技大学的课程讲解更适合初学者&#xff08;缺点在于&#xff0c;从概念到…

linux 07 存储管理

02. ext4是一种索引文件系统 上面是索引节点inode&#xff0c;存放数据的元数据 下面是存储块block&#xff0c;主要存放有关的信息 03.linux上的inode 查看文件中的inode ll -i 文件名 磁盘中的inode与文件数量