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 哈希表 快速定位页是否在内存中
相关推荐
wabs66639 分钟前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
lsylalalala3 小时前
常见的排序算法1
数据结构·算法·排序算法
imaol14 小时前
数据结构---队列
java·数据结构·算法
疯狂打码的少年4 小时前
【数据结构】串的模式匹配:KMP算法(重点)
数据结构·笔记·算法
一米阳光86614 小时前
软考(中级)软件设计师核心笔记(8)数据结构——线性结构、数组、矩阵
数据结构·笔记·职场发展·软考·软件设计师·中级职称
疯狂打码的少年5 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
小龙报7 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯
rimydu1974art7 小时前
# OpenCheck 废标风控系统技术实现
数据结构
rannn_1118 小时前
【力扣hot100】链表专题|21、2、19、24、92、25
java·数据结构·算法·leetcode·链表·开发
Gust of wind8 小时前
数据结构基础:线性表及其存储实现
数据结构