《MySQL InnoDB Buffer Pool 详解(二):Free、Clean、Dirty 三种缓冲页状态与三大链表》
2026/9/16 10:03:42
网站建设
项目流程
MySQL InnoDB Buffer Pool 详解(二):Free、Clean、Dirty 三种缓冲页状态与三大链表 MySQL InnoDB Buffer Pool 详解(二):Free、Clean、Dirty 三种缓冲页状态与三大链表 前言 先理解一个核心概念:Buffer Pool 是按“页”管理的 什么是 Buffer Page Buffer Page 的三种基本状态 什么是 Free Page 什么是 Clean Page 什么是 Dirty Page Dirty Page 为什么不能直接淘汰 为什么数据库要允许 Dirty Page 存在 三种页面状态之间的转换 Free → Clean Clean → Dirty Dirty → Clean Clean → Free 页面多了以后,InnoDB 怎么管理? Free List:管理可用页面 LRU 是什么 LRU List 的作用 InnoDB 的 LRU 并不是最简单的 LRU InnoDB LRU 的 Young 区和 Old 区 为什么需要 Old 区 `innodb_old_blocks_pct` `innodb_old_blocks_time` LRU List 中只有 Clean Page 吗? 如果 LRU 尾部是 Clean Page 如果 LRU 尾部是 Dirty Page Flush List:专门关注脏页 LRU List 关注: Flush List 关注: Flush List 并不是“所有页面的链表” Dirty Page 可以同时在 LRU List 和 Flush List 中吗? 三大 List 到底有什么区别 把三种状态和三大链表组合起来 一个页面完整的生命周期 第一步:页面不在 Buffer Pool 第二步:读取磁盘 第三步:页面参与 LRU 管理 第四步:执行 UPDATE 第五步:进入脏页管理 第六步:后台刷盘 第七步:页面长期不再访问 Buffer Pool 空间不足时会发生什么 情况一:存在 Free Page 情况二:Free Page 不够 情况三:候选页是 Dirty Page 为什么要提前保持一定数量的 Free Page `innodb_lru_scan_depth` `innodb_lru_scan_depth` 不是越大越好 Free List、LRU List、Flush List 不是三个独立内存区域 Free、Clean、Dirty 也不是三个固定物理区域 生产环境为什么要关注 Dirty Page 1. 页面淘汰成本增加 2. I/O 压力可能集中 3. Checkpoint 压力增大 如何查看 Buffer Pool 当前状态 几个最容易混淆的问题 1. Free Page 就是内容全为 0 的内存吗? 2. Clean Page 就是不再使用的页面吗? 3. Dirty Page 就是不安全的数据吗? 4. LRU List 就是 Dirty List 吗? 5. Flush List 就是刷盘顺序表吗? 一张图彻底串联 Buffer Pool 页面管理 面试中应该如何回答 总结 MySQL InnoDB Buffer Pool 详解(二):Free、Clean、Dirty 三种缓冲页状态与三大链表 前言 上一篇文章主要梳理了 MySQL 的内存结构,介绍了:
InnoDB Buffer Pool Redo Log Buffer Sort Buffer Join Buffer Read Buffer 线程级内存与全局共享内存的区别 其中最重要的一块内存就是:
InnoDB Buffer Pool但是仅仅知道“Buffer Pool 用来缓存数据页和索引页”还不够。
一个数据页从磁盘加载到 Buffer Pool 后,可能会经历:
在这个过程中,页面的状态会发生变化。
为了高效管理这些页面,InnoDB 还维护了几个非常重要的数据结构:
Free List LRU List Flush List这