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

news2024/9/23 17:21:39

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.coloradmin.cn/o/32541.html

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

相关文章

MariaDB 数据文件 迁移

1. 需求 原MariaDB采用默认安装,安装在/所在的分区下,现在该服务器的磁盘空间不补足了,现在扩展插入了一块新的磁盘,并且挂载到了/www/目录下,现在需要将原来的数据库数据迁移至该目录下。 2. 查询数据存储目录 首先…

预测足球世界杯比赛

目录 1. 下载数据集 2. 数据预处理 3. 模型训练与选择 4. 预测 1. 下载数据集 下载后数据如下: FIFA World Cup | Kaggle 2. 数据预处理 reprocess_dataset() 方法是数据进行预处理。预处理过的数据如下: save_dataset() 方法是对预处理过的数据&…

LibreOJ_10010

链接 点此跳转 思路 题目描述 有 nnn 个小朋友坐成一圈,每人有 aia_iai​ 颗糖果。 每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 111 。 求使所有人获得均等糖果的最小代价。 分析 设 xix_ixi​ 表示第 iii 个朋友向第 i−1i-1i−1 个小朋友…

爬虫与云服务器云数据库

腾讯云轻量应用服务器TDSQL-MYSQL数据库PYTHON做爬虫 实现目标:轻量应用服务器上运行Python爬虫,把数据写到TDSQL-MYSQL数据库中。 最近双十一,趁着这一波福利,在腾讯云购买了一个轻量应用服务器和TDSQL-MYSQL版的数据库。买来之…

OpenGL学习

1.1,状态机-上下文-对象 GPU渲染流程 OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。 状态机:变量(描述该如何操作)的大集合 OpenGL的状态通常被称为OpenGL上下文(Contex…

异构图注意力网络Heterogeneous Graph Attention Network ( HAN )

文章目录前言一、基础知识1.异构图(Heterogeneous Graph)2.元路径3.异构图注意力网络二、异构图注意力网络1.结点级别注意力(Node-level Attention)2.语义级别注意力(Semantic-level Attention)总结前言 异…

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

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

前端框架 Nuxtjs Vue3 SEO解决方案 SSR

目录 一、Nuxtjs安装 二、路由规则 三、公共布局 四、Vue3中TypeScript的使用 一、Nuxtjs安装 参考&#xff1a;Installation Get Started with Nuxt安装 - NuxtJS | Nuxt.js 中文网Installation Get Started with Nuxt yarn create nuxt-app <项目名> 项目运行…

GAMES101 作业0 环境配置 PC下简单配置i

前言 GAMES101提供了计算机图形学相关教学知识&#xff0c;闫教授及其团队也为大家准备了相应课程作业。课程作业部署在虚拟机上&#xff0c;以便免去环境部署的麻烦。但对于一些同学来说&#xff0c;还是希望直接在WIN的VS上使用并编码&#xff0c;本文对此进行简单说明。 环…

神经网络和深度学习-后向传播back propagation

后向传播back propagation 首先我们要了解&#xff0c;前向传播&#xff0c;损失函数这些前置知识&#xff0c;下面我们给出一张神经网络的图 反向传播通过导数链式法则计算损失函数对各参数的梯度&#xff0c;并根据梯度进行参数的更新 下面举个简单的例子 我们需要知道x,y,…

Linux C网络通信过程

socket函数、sockaddr_in结构体 和 bind函数 socket函数的作用是创建一个网络文件描述符&#xff0c;程序通过这个文件描述符将数据发送到网络&#xff0c;也通过这个文件描述符从网络中接受数据。观察一下socket函数&#xff1a; int listenfd; listenfd socket(AF_INET, S…

NNDL 作业11:优化算法比较

目录 1. 编程实现图6-1&#xff0c;并观察特征 2. 观察梯度方向 3. 编写代码实现算法&#xff0c;并可视化轨迹 4. 分析上图&#xff0c;说明原理&#xff08;选做&#xff09; 5. 总结SGD、Momentum、AdaGrad、Adam的优缺点&#xff08;选做&#xff09; 6. Adam这么好&…

Python威布尔分布

文章目录威布尔分布及其性质在Python中生成威布尔分布的随机数指数分布和拉普拉斯分布的对比威布尔分布及其性质 威布尔分布&#xff0c;即Weibull distribution&#xff0c;又被译为韦伯分布、韦布尔分布等&#xff0c;是仅分布在正半轴的连续分布。 在numpy.random中&#…

python中urllib库的使用

1. 获取目标页面的源码 以获取百度页面源码为例 #使用urllib获取百度首页的源码 import urllib.request#1 定义一个url 作为需要访问的网址 url http://www.baidu.com#2 模拟浏览器向服务器发送请求 response响应 response urllib.request.urlopen(url)#3 获取响应中的页面…

Monkey测试

一、什么是 Monkey 测试 Monkey 测试是通过向系统发送伪随机的用户事件流&#xff08;如按键输入、触摸屏输入、手势输入等&#xff09;&#xff0c;实现对应用程序客户端的稳定性测试&#xff1b;通俗来说&#xff0c;Monkey 测试即“猴子测试”&#xff0c;是指像猴子一样&a…

JVM垃圾回收算法整理

JVM垃圾回收算法整理前言关键概念了解标记–清除算法复制算法标记–整理算法分代收集算法仰天大笑出门去&#xff0c;我辈岂是蓬蒿人前言 大概内容&#xff1a; jvm垃圾回收算法&#xff1a; 1、“标记–清除”算法&#xff1b;首先标记出所有需要被回收的对象&#xff0c;然…

搭建自己的SSR

Vue SSR介绍 是什么 官方文档&#xff1a;https://ssr.vuejs.org/Vue SSR&#xff08;Vue.js Server-Side Rendering&#xff09; 是 Vue.js 官方提供的一个服务端渲染&#xff08;同构应用&#xff09;解 决方案使用它可以构建同构应用还是基于原有的 Vue.js 技术栈 官方文档…

XXL-JOB逻辑自测及执行参数配置踩坑

概述 关于XXL-JOB的使用遇到的问题记录。对XXL-JOB不熟的&#xff0c;可以先参考分布式任务调度平台XXL-JOB深度实战 实战 业务DTO定义如下&#xff1a; Data public class AdAccountDTO {private String accountId;/*** yyyy-MM-dd HH:mm:ss*/private String startCreateT…

ThingBoard源码解析-缓存

配置 TB支持两种缓存&#xff1a;Caffeine和Redis,通过配置cache.type来指定使用哪种缓存。 位于 org.thingsboard.server.cache Caffeine 配置类&#xff1a;CaffeineCacheConfiguration Configuration ConditionalOnProperty(prefix "cache", value "t…

HTML CSS 个人网页设计 WEB前端大作业代码

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…