432 字
2 分钟
InnoDB Buffer Pool 如何提升查询与写入性能
Buffer Pool 是 InnoDB 在内存中的页缓存。查询所需的数据页若已缓存,可避免读盘;更新先修改缓存页,使其成为脏页,再由后台线程或相关刷新机制写回表空间。Buffer Pool 还缓存索引页等内容,因此容量会影响热数据的命中概率,但增大缓存不保证所有查询都变快,工作集和访问模式同样重要。
空间不足时,InnoDB 根据近似 LRU 的管理策略淘汰可回收页;脏页必须先写盘才能释放。顺序扫描、大表导入等可能冲击热点缓存,InnoDB 使用 midpoint insertion 等策略降低一次性扫描污染。后台刷脏需要平衡写入吞吐、checkpoint 推进与磁盘 I/O,不能简单理解为“脏页越少越好”。
排查时可结合 SHOW ENGINE INNODB STATUS、SHOW GLOBAL STATUS 中的缓冲池读请求与物理读计数,以及 Performance Schema 指标观察命中和刷新趋势。命中率很高也不能证明 SQL 合理:反复扫描大量缓存页仍可能消耗 CPU 和内存带宽。扩容前先看慢查询、索引和工作集。
追问
- 缓存命中率高是否代表没有磁盘 I/O? 不代表。后台刷脏、日志、临时表及未命中的其他页仍可能产生 I/O。
- Buffer Pool 和操作系统页缓存一样吗? 不一样。Buffer Pool 是 InnoDB 管理的数据库页缓存,页面组织和刷新由引擎控制。
- 为什么大表扫描会影响热点查询? 扫描引入大量页访问,可能挤占缓存和 I/O 带宽;需评估访问策略及缓冲池行为。
InnoDB Buffer Pool 如何提升查询与写入性能
https://blog.xqcherry.top/posts/interview/mysql/buffer-pool/ 目录