后端进阶知识 Buffer pool 图文详解 之 free链表

news/2024/5/8 6:51:52/文章来源:https://blog.csdn.net/weixin_44994494/article/details/128017215

Buffer pool 图文详解 之 free 链表

    • 前言
    • 数据页
    • 缓存页+描述信息
    • 初始化 Buffer pool
    • free 链表
    • 获取空闲页
    • 数据页是否缓存

可关注专栏 ====》MySQL 进阶知识
收藏点赞加关注

前言

Buffer pool 是 InnerDB 存储引擎的一个重要组件,MySQL 的所有 CRUD 操作都是围绕 Buffer pool 进行的。现在只知道 Buffer pool 是一个缓冲池,里面存放了磁盘数据的缓存,那么 Buffer pool 是一个什么样的结构,是如何在 SQL 执行过程中起作用的呢?
在这里插入图片描述

数据页

MySQL 中抽象出来的数据单位。以前我理解的数据库核心数据模型就算表+行+字段,而实际是抽象出了一个数据页的概念,把每一行的数据都存放在了数据页,数据页是 MySQL 存储中的最小单元。所以要去更新某一行数据,就需要找到这行数据所在的数据页,然后从磁盘加载到缓冲池 Buffer pool。
在这里插入图片描述

缓存页+描述信息

数据页加载到 Buffer pool 对应的是一个个的缓存页,而每个缓存页都会对应一个描述信息。描述信息本身也是数据块,放在缓存页的前面。描述数据(元数据)的大小相当于缓存页的 5% 左右,如果 buffer pool 的大小为 128 MB ,实际大小可能在 130 MB 左右,因为描述数据也要占用部分空间。
在这里插入图片描述

初始化 Buffer pool

数据库启动时,会根据配置的 Buffer pool 大小申请一块合适的内存空间,作为 Buffer pool 的内存区域,之后会按照缓存页大小和元数据大小把 Buffer pool 内存区域划分为缓存页和元数据。只是初始化时缓存页都是空的,在执行 CRUD 时会把数据页加载到缓存页中。
在这里插入图片描述

free 链表

现在知道缓存页都是数据库启动时初始化好了的。而在使用时只需要往缓存页写数据就行了,那么哪些缓存页是空闲的?

这时就需要一个数据结构来表示空闲的缓存页。free 链表是一个由元数据组成的双向链表结构,在链表中的每个节点都是空闲缓存页的元数据。也就是空闲的缓存页的元数据都在 free 链表中。它有一个不属于 Buffer pool 的基础节点保存着双向链的头节点地址和尾节点地址,还保存了空闲节点的数量。
在这里插入图片描述

实际上元数据中保存了一对双向指针,指针 free_pre 指向当前元数据的前一个元数据地址,指针 free_next 指向当前元数据的后一个元数据地址。
在这里插入图片描述

获取空闲页

有了 free 链表结构之后,怎么把数据页读取到缓存页?这时就可以从 free 链表中获取一个元数据找到对应的缓存页,然后把数据读到缓存页就可以了,随后把 free 中的这个元数据移除。可是元数据是 MySQL 初始化时创建的,直接删掉?那对应的缓存页岂不是没有元数据了?实际上所谓的删除就是让当前元数据的前后元数据不要再引用自己了,那么这个元数据也就从链表中移除了。

以三个元数据为例,free 链表初始状态每相邻的两个元数据都相互形成了“环”,并且链表的头尾地址保存在基础节点中。此时链表中存在三个节点两个“环”。
在这里插入图片描述

当链表尾部的元数据被使用,那么被使用元数据的前一个元数据不再引用它的地址,而且基础节点保存的尾部节点地址也向前移动到前一个元数据地址。此时链表中只存在两个节点一个“环”。
在这里插入图片描述

当链表头部的元数据被使用,那么被使用元数据的后一个元数据不再引用它的地址,而且基础节点保存的头部节点地址也向后移动到后一个元数据地址,此时链表中只存在一个节点零个“环。
在这里插入图片描述

当链表的所有元数据都被使用后,链表将不存在了?不,所谓的链表只是元数据中的前后指针形成的。空闲的元素据用完后,元数据并不会实际删除,只是从链表移除而已。当使用完元数据后,元数据将重新添加到链表,只不过把它的指针交给它的前后节点就行了,这相当于删除的逆向操作。
在这里插入图片描述

数据页是否缓存

数据库会存在一个哈希表的结构,会用表空间号+数据页号,作为一个 key,然后缓存页地址作为 value。当使用这个数据页时,就可以通过 key 去查找数据页是否已经缓存,防止数据页被重复加载。

在这里插入图片描述

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

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

相关文章

Vue3+nodejs全栈项目(资金管理系统)——后端篇(一)登录、注册

文章目录初始化创建项目配置跨域配置解析表单数据的中间件安装bodyparser初始化用户路由模块抽离用户路由模块中的处理函数登录注册新建admin表安装并配置mysql模块注册检测表单数据是否合法检测用户名是否被占用对密码进行加密处理bcryptjs插入新用户测试登录根据名字查询用户…

Java基础知识+必考面试题(分享收藏版)

在学习Java语言之前,我们要了解相关知识体系,才能更好的掌握学习。那么下面我们就一起来学习JAVA语言吧~ Java语言概述 Java语言是Sun公司在1995年推出的高级编程语言,编程语言就是计算机语言,人们可以通过使用编程语言让计算机完…

红黑树C++实现

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入 4.1 插入节点 4.2 插入节点的颜色 4.3 调整情况1 4.4 调整情况2 4.5 调整情况3 4.6 调整情况总结 五、调整的实现 5.1 调整的步骤分析 5.2 代码实现 六、树的平衡判断 七、源代码…

一文让你了解数据采集

随着云计算、大数据、人工智能的发展,数据采集作为数据的重要手段,成为广大企业的迫切需求。 所谓“得数据者,得人工智能”,如今人工智能早已在我们的生活中屡见不鲜。如“人脸识别”、“语音唤醒音响”等都属于人工智能的范畴。…

擎创技术流 | ClickHouse实用工具—ckman教程(4)

《使用CKman导入集群》 CKman(ClickHouse Manager)是由擎创科技自主研发的一款管理ClickHouse的工具,前端用Vue框架,后端使用Go语言编写。它主要用来管理ClickHouse集群、节点以及数据监控等,致力于服务ClickHouse分布…

总结我的 MySQL 学习历程,给有需要的人看

作者| 慕课网精英讲师 马听 你好,我是马听,现在是某零售公司的 MySQL DBA,身处一线的我表示有很多话要讲。 我的MySQL学习历程 在我大三的时候,就开始接触到 MySQL 了,当时我也是从最基础的 MySQL 知识(…

如何实现办公自动化?

办公自动化(OA)允许数据在没有人工干预的情况下流动。由于人工操作被排除在外,所以没有人为错误的风险。如今,办公自动化已经发展成无数的自动化和电子工具,改变了人们的工作方式。 办公自动化的好处 企业或多或少依…

[附源码]计算机毕业设计JAVA领导干部听课评课管理系统

[附源码]计算机毕业设计JAVA领导干部听课评课管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM…

【LeetCode与《代码随想录》】哈希表篇:做题笔记与总结-JavaScript版

文章目录代码随想录主要题目242. 有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和(经典哈希)454. 四数相加 II15. 三数之和(双指针)18. 四数之和(双指针)相关题目383. 赎金信49. 字母异位词分组…

Python遥感开发之GDAL读写遥感影像

Python遥感开发之GDAL读写遥感影像1 读取tif信息方法一2 读取tif信息方法二3 自己封装读取tif的方法(推荐)4 对读取的tif数据进行简单运算5 写出tif影像(推荐)前言:主要介绍了使用GDAL读写遥感影像数据的操作,包括读取行、列、投影…

从零学习 InfiniBand-network架构(八) —— IB协议中的原子操作

从零学习 InfiniBand-network架构(八) —— IB协议中的原子操作 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🔑未经作者允许,禁止转载 🚩本专题部分内容源于《InfiniBand-net…

Docker——容器命令介绍、创建Nginx容器与Redis容器

目录 一、容器命令 二、创建并运行Nginx容器 1.1 去dockerhub查看Nginx容器运行命令 1.2 怎么访问Nginx? 1.3 查看容器日志 1.4总结 三、进入Nginx容器并修改HTML内容 3.1 进入容器 3.2 进入Nginx的HTML所在目录 3.3 修改index.html文件(容器内修…

【OpenEVSE 】汽车充电桩控制项目解析

【OpenEVSE 】汽车充电桩控制项目解析1. 项目介绍2. 项目硬件3. 软件原理以及流程4. 系统结构:ESP32RAPI APIMQTT 上的 RAPI:5. SAE J1772协议简析:6. 专用充电接插件7 . 源码解析:此项目来源于openEnergyMonitor 的 openEVSE 部分&#xff0…

查阅必备----常用的SQL语句,配语句和图解超详细,不怕你忘记

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐查阅必备–常用的SQL语句⭐ 文章目录⭐查阅必备--常用的SQL语句⭐一,关键语句大全&am…

python离线安装module以及常见问题及解决方案

文章目录一,离线安装module1.1 下载module1.2 离线安装二,常见的问题2.1 模块缺少合适的适配:error: Could not find suitable distribution for Requirement.parse()2.2 install成功但发现控制台打印的最后一行显示下载module版本为0.0.0工作…

微信商城小程序怎么开发_分享微信商城小程序的搭建

如何搭建好一个微信商城?这三个功能要会用! 1.定期低价秒杀,提高商城流量 除了通过私域流量裂变,低价秒杀是为商城引流提高打开率的良好手段。 以不同节日作为嘘头,在情人节、38妇女节、中秋国庆、七夕节等日子&…

机器学习-回归模型相关重要知识点

目录01 线性回归的假设是什么?02 什么是残差,它如何用于评估回归模型?03 如何区分线性回归模型和非线性回归模型?04 什么是多重共线性,它如何影响模型性能?05 异常值如何影响线性回归模型的性能&#xff1f…

R语言结课及Matlab开始

R语言结课 我们R语言的学习这节课下课就结束了,接下来进行Matlab的学习。下面我会说一下R的结课任务及如何考试,以及我自己整理的Matlab安装教程。 R的结课作业:周二上课时提到的两个回归模型课程总结(老师说作业总结主要是作业…

通过ref进行组件间的通信

ref&#xff1a;绑定dom节点&#xff0c;拿到的就是dom对象&#xff1b; ref&#xff1a;绑定组件&#xff0c;拿到的就是组件对象&#xff1b; ref绑在dom节点上&#xff1a; //绑在dom上&#xff0c; <input type"text" ref"mytext"> <input…

SpringBoot SpringBoot 开发实用篇 6 监控 6.3 actuator

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.3 actuator6.3.1 actuator6.3.2 监控原理6.3.3 小结6 监控 …