《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
        • Free Page 不是永久固定的
      • 什么是 Clean Page
        • Clean Page 为什么容易被淘汰
      • 什么是 Dirty Page
        • Dirty Page 为什么不能直接淘汰
        • 为什么数据库要允许 Dirty Page 存在
    • 三种页面状态之间的转换
      • Free → Clean
      • Clean → Dirty
      • Dirty → Clean
      • Clean → Free
  • 页面多了以后,InnoDB 怎么管理?
    • Free List:管理可用页面
      • 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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询