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 哈希表 快速定位页是否在内存中
相关推荐
汀、人工智能2 小时前
[特殊字符] 第97课:前K个高频元素
数据结构·算法·数据库架构··数据流·前k个高频元素
沉鱼.442 小时前
第十四届题目
数据结构·算法
美式请加冰2 小时前
简单多状态问题
数据结构·算法·leetcode
计算机安禾2 小时前
【数据结构与算法】第38篇:图论(二):深度优先搜索(DFS)与广度优先搜索(BFS)
数据结构·算法·矩阵·排序算法·深度优先·图论·宽度优先
汀、人工智能3 小时前
[特殊字符] 第56课:在排序数组中查找元素的首末位置
数据结构·算法·数据库架构·图论·bfs·在排序数组中查找元素的首末位置
木子墨5163 小时前
LeetCode 热题 100 精讲 | 动态规划进阶篇:最大子数组和 · 分割等和子集 · 最长公共子序列 · 打家劫舍 III
数据结构·c++·算法·leetcode·动态规划·力扣
li1670902703 小时前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
Z1Jxxx3 小时前
C++ P1150 Peter 的烟
数据结构·c++·算法
笨笨饿3 小时前
# 52_浅谈为什么工程基本进入复数域?
linux·服务器·c语言·数据结构·人工智能·算法·学习方法