432 字
2 分钟
InnoDB Buffer Pool 如何提升查询与写入性能
  1. 1MySQL 面试复习导读:知识地图与阅读路线
  2. 2MySQL 存储引擎怎么选:InnoDB、MyISAM 与 MEMORY
  3. 3MySQL 索引类型与 B+ 树:结构、分类和失效场景
  4. 4MySQL B+ 树查询全过程:从根节点到页目录
  5. 5InnoDB 聚簇索引与二级索引:什么是回表
  6. 6MySQL 覆盖索引:如何避免回表
  7. 7MySQL 联合索引的最左前缀匹配原则
  8. 8MySQL 索引下推:把过滤提前到存储引擎
  9. 9MySQL 事务异常读:脏读、不可重复读与幻读
  10. 10MySQL 四种事务隔离级别与选型取舍
  11. 11MySQL MVCC:Undo Log、版本链与 ReadView
  12. 12MySQL InnoDB 锁的分类:行锁、表锁与意向锁
  13. 13MySQL 乐观锁与悲观锁:冲突少时重试,冲突多时排队
  14. 14MySQL 发生死锁怎么办:检测、定位与处理
  15. 15MySQL 事务的 ACID 特性分别是什么
  16. 16InnoDB Redo Log 如何保证崩溃恢复
  17. 17InnoDB Undo Log 的回滚与 MVCC 作用
  18. 18MySQL Binlog 是什么,和 Redo Log 有什么区别
  19. 19一条 MySQL 查询从连接到返回结果经历什么
  20. 20如何用 EXPLAIN 读懂 MySQL 执行计划
  21. 21MySQL 为什么需要 Redo Log 与 Binlog 两阶段提交
  22. 22MySQL 崩溃后如何恢复已提交事务
  23. 23InnoDB Buffer Pool 如何提升查询与写入性能本文
  24. 24联合索引应该如何设计
  25. 25InnoDB 快照读与当前读如何处理幻读
  26. 26联合索引范围条件之后的列还能使用吗
  27. 27MySQL 索引看起来失效了,如何判断优化器的选择
  28. 28MySQL 8.0 如何定位并处理 InnoDB 死锁
  29. 29MySQL 慢查询如何定位和优化
  30. 30MySQL 的 ORDER BY、GROUP BY 与 filesort
  31. 31MySQL 普通索引和唯一索引如何选择
  32. 32MySQL 主从复制的基本流程是什么
  33. 33MySQL 主从延迟和读写分离如何处理
  34. 34MySQL 深分页为什么慢,如何改写
  35. 35InnoDB 主键应该如何设计
  36. 36MySQL 字符集与排序规则有什么区别
  37. 37数据库范式与反范式如何取舍

Buffer Pool 是 InnoDB 在内存中的页缓存。查询所需的数据页若已缓存,可避免读盘;更新先修改缓存页,使其成为脏页,再由后台线程或相关刷新机制写回表空间。Buffer Pool 还缓存索引页等内容,因此容量会影响热数据的命中概率,但增大缓存不保证所有查询都变快,工作集和访问模式同样重要。

空间不足时,InnoDB 根据近似 LRU 的管理策略淘汰可回收页;脏页必须先写盘才能释放。顺序扫描、大表导入等可能冲击热点缓存,InnoDB 使用 midpoint insertion 等策略降低一次性扫描污染。后台刷脏需要平衡写入吞吐、checkpoint 推进与磁盘 I/O,不能简单理解为“脏页越少越好”。

排查时可结合 SHOW ENGINE INNODB STATUS、SHOW GLOBAL STATUS 中的缓冲池读请求与物理读计数,以及 Performance Schema 指标观察命中和刷新趋势。命中率很高也不能证明 SQL 合理:反复扫描大量缓存页仍可能消耗 CPU 和内存带宽。扩容前先看慢查询、索引和工作集。

追问#

  1. 缓存命中率高是否代表没有磁盘 I/O? 不代表。后台刷脏、日志、临时表及未命中的其他页仍可能产生 I/O。
  2. Buffer Pool 和操作系统页缓存一样吗? 不一样。Buffer Pool 是 InnoDB 管理的数据库页缓存,页面组织和刷新由引擎控制。
  3. 为什么大表扫描会影响热点查询? 扫描引入大量页访问,可能挤占缓存和 I/O 带宽;需评估访问策略及缓冲池行为。
InnoDB Buffer Pool 如何提升查询与写入性能
https://blog.xqcherry.top/posts/interview/mysql/buffer-pool/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0