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 哈希表 快速定位页是否在内存中
相关推荐
春日见13 分钟前
算法与数据结构----哈希表
数据结构·人工智能·算法·机器学习·自动驾驶·哈希算法·散列表
萌动的小火苗41 分钟前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
叩码以求索44 分钟前
统计按位或能得到最大值的子集数目(一)
数据结构·算法
tachibana21 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
txzrxz1 小时前
单调队列讲解
数据结构·c++·算法·单调队列
Keven_112 小时前
算法札记:树状数组的用途
数据结构·算法
cpp_25013 小时前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解
星恒随风5 小时前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
梅梅绵绵冰5 小时前
算法题-矩阵
数据结构·算法·矩阵
奋发向前wcx16 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法