直接回答:Buffer Pool 是 InnoDB 的内存缓存区(innodb_buffer_pool_size,通常配物理内存的 50%~70%),以 16KB 页为单位缓存数据页、索引页、Change Buffer 和自适应哈希索引。管理核心是改进版 LRU:链表分为 young 区(前 5/8)和 old 区(后 3/8,比例由 innodb_old_blocks_pct 控制),新读入的页只放到 old 区头部,且在 old 区停留超过 innodb_old_blocks_time(默认 1000ms)之后再次被访问,才会晋升到 young 区。
展开解析:这两个设计共同解决“缓冲池污染”:全表扫描、预读会把大量只访问一次的冷页灌进来,标准 LRU 会把热点页一次性挤出;分段+时间窗口让冷页在 old 区停留期间就被淘汰,热点页不受影响。预读分线性预读(按区)和随机预读(5.6 起默认关闭)。脏页落盘由 redo checkpoint 推进,后台线程按 innodb_io_capacity 限速刷盘;LRU 尾部是脏页时淘汰前必须先写盘。innodb_buffer_pool_instances(默认 8)把池分片减少互斥竞争,单个实例管理自己的 LRU 和 free list。重启预热靠 innodb_buffer_pool_dump_at_shutdown / load_at_startup 保存和加载页号(只存元信息,重启后按表扫描预热),避免冷启动后性能雪崩。Buffer Pool 不足的典型症状是命中率下降、free pages 见底、单页等待刷脏。
实践要点:监控关注 Buffer Pool 命中率(应 >99%)、pages made young 速率(异常飙高说明有扫描污染)、脏页比例。
追问方向:为什么不用标准 LRU?一次全表扫描真的会冲垮 Buffer Pool 吗?脏页刷盘有哪些触发条件? (约 363 字)