Buffer Pool的数据结构

在数据库系统(如 MySQL InnoDB)中,Buffer Pool 是内存管理的核心。它不仅是一个简单的缓存队列,而是一套为了高效管理内存页(Page)而设计的复杂数据结构。

其核心组成部分可以概括为:控制块、实际缓冲页、以及三大链表


1. 内存实体:控制块与缓冲页

当你启动数据库并申请 Buffer Pool 内存时,它会被划分为若干个连续的 "页面实体"

  • 缓冲页 (Page Entity) :默认大小通常为 16KB。这是存储磁盘数据的真实载体。

  • 控制块 (Control Block):为了管理这些 16KB 的缓冲页,MySQL 为每个缓冲页分配了一个控制块。

    • 包含内容:页面的表空间 ID、页号、该页在 Buffer Pool 中的内存地址、链表指针(prev/next)等。

    • 位置:存放在 Buffer Pool 的最前端。控制块与缓冲页是一一对应的。


2. 三大核心管理链表

由于 Buffer Pool 的空间有限,必须通过数据结构来追踪哪些页是空的、哪些被改过、哪些最不常用。

① Free List(空闲链表)
  • 作用:记录当前 Buffer Pool 中哪些缓冲页是空的(未被占用)。

  • 结构 :由所有空闲页的控制块组成的双向链表。

  • 过程:当需要从磁盘加载页时,从 Free List 中取出一个节点,填入数据,然后从该链表中移除。

② LRU List(最近最少使用链表)

这是 Buffer Pool 最核心的逻辑,用于决定当内存满时"淘汰谁"。为了解决"全表扫描"导致的缓存污染,InnoDB 对标准的 LRU 进行了优化:

  • 冷热分区 :链表被分为 Young(热区)Old(冷区),比例通常为 63:37。

  • 优化逻辑

    1. 新加载的页首选放入 Old 区 的头部。

    2. 如果在 Old 区停留超过一定时间(如 innodb_old_blocks_time,默认 1s)后再次被访问,才会被移动到 Young 区 头部。

    • 这样可以防止大表扫描导致热数据被一次性冲刷掉。
③ Flush List(脏页链表)
  • 作用:记录哪些页在内存中被修改了(数据与磁盘不一致),等待刷盘。

  • 结构:所有被修改过的页控制块构成的链表。

  • 注意 :脏页既在 LRU 链表中(因为它是被访问的页),也在 Flush List 中。


3. 加速定位:哈希表 (Hash Table)

为了避免每次判断"某个页是否已在内存"时都要遍历链表(O(n)),Buffer Pool 额外维护了一个 哈希表

  • Key表空间ID + 页号

  • Value:对应的控制块内存地址。

  • 效果:通过哈希表,数据库可以以 O(1) 的时间复杂度快速判断数据页是否已缓存。


4. 进阶结构:多个 Buffer Pool 实例

在高性能多线程场景下,为了减少链表加锁带来的竞争,Buffer Pool 会被拆分为多个 Instances

  • 每个 Instance 拥有独立的链表和锁。

  • 通过 hash(space_id, page_no) % instances 来决定页落在哪个实例。


总结对照表

组件 数据结构 解决的问题
缓冲页 连续物理内存 (16KB) 减少磁盘 I/O
Free List 双向链表 快速找到空闲内存空间
LRU List 改进型双向链表 高效置换,防止缓存污染
Flush List 双向链表 追踪需要异步刷盘的脏页
Page Hash 哈希表 快速定位页是否在内存中
相关推荐
叼烟扛炮5 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
MegaDataFlowers8 小时前
206.反转链表
数据结构·链表
CN-Dust9 小时前
【C++】while语句例题专题
数据结构·c++·算法
xieliyu.12 小时前
Java手搓数据结构:从零模拟实现无头双向非循环链表
java·数据结构·链表
如何原谅奋力过但无声13 小时前
【灵神高频面试题合集01-03】相向双指针、滑动窗口
数据结构·python·算法·leetcode
jieyucx14 小时前
Go 数据结构入门:线性表、顺序表、链表
数据结构·链表·golang
阿维的博客日记15 小时前
zset为什么要用到skiplist+Dict的数据结构
数据结构·skiplist
编程之升级打怪16 小时前
KMP查询算法的匹配串的前缀后缀相同的最大长度
数据结构
没文化的阿浩17 小时前
【数据结构】排序(2)——直接选择排序、堆排序
数据结构·算法·排序算法
承渊政道18 小时前
【动态规划算法】(子数组系列问题建模与解题思路精讲)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法