跳转至

MySQL Buffer Pool 机制

一、是什么

InnoDB 在内存里缓存数据页和索引页,避免每次都读磁盘。

Buffer Pool(内存)
  ├── 数据页
  ├── 索引页
  ├── undo 页
  └── 修改缓冲

二、为什么重要

磁盘 IO 是瓶颈,内存比磁盘快 10 万倍。Buffer Pool 命中率决定性能。

三、配置

innodb_buffer_pool_size = 物理内存的 50-70%

四、管理

LRU 链表

  • 最近使用的放头部。
  • 淘汰尾部。

改进 LRU

InnoDB 的 LRU 分两部分: - young(5/8):热点数据。 - old(3/8):新读入的数据。

避免全表扫描把热点挤掉。

五、预读

  • 线性预读:读到一个 extent 的大部分,预读下一个 extent。
  • 随机预读:磁盘上相邻的页。

六、刷脏页

修改后先写 Buffer Pool,再异步刷磁盘。redo log 保证持久化。

七、大并发为什么要调大 Buffer Pool

  • 数据都在内存,查询不读磁盘。
  • 命中率 > 99%,性能飙升。
  • 太小,频繁从磁盘读。

面试要点

Buffer Pool 是 InnoDB 性能的核心。命中率高 = 快。