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

本文深入探讨了MySQL的Bufferpool结构,它是存储引擎的关键组件,负责数据页的缓存。文章详细介绍了数据页的概念,缓存页与描述信息,以及Bufferpool的初始化过程。重点讲解了free链表如何管理空闲缓存页,通过双向链表结构高效地分配和释放空间。此外,还提到了数据页是否已缓存的检查机制——哈希表。整体内容旨在帮助读者理解MySQL内部缓存机制的工作原理。
摘要由CSDN通过智能技术生成

可关注专栏 ====》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 去查找数据页是否已经缓存,防止数据页被重复加载。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

变成派大星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值