Buffer Pool预热是数据库重启后主动将常用数据页加载至内存以缩短冷启动性能爬升时间。因重启后缓冲池为空,首次查询需磁盘I/O导致延迟飙升,预热通过全表扫描、自动dump/load或分块主键读等方式提前加载热点数据,并需避开高峰期、控制并发、监控命中率。

Buffer Pool预热是什么
MySQL或PostgreSQL等数据库重启后,Buffer Pool(缓冲池)是空的,首次查询需要从磁盘读取数据页,响应明显变慢。Buffer Pool预热就是让数据库在启动初期主动把常用数据页加载到内存中,缩短冷启动后的性能爬升时间。
为什么重启后性能差
因为Buffer Pool里没有热点数据,所有查询都触发物理I/O,尤其是大表、索引扫描、高频访问的业务表,延迟飙升。即使SSD也扛不住大量随机读,而预热能把这部分I/O前置到低峰期或启动阶段。
常见预热方法
手动触发预热(MySQL):
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
- 执行SELECT COUNT(*) FROM table_name对核心表全表扫描,强制加载数据页到Buffer Pool
- 用innodb_buffer_pool_dump_at_shutdown=ON + innodb_buffer_pool_load_at_startup=ON,自动保存/恢复最近使用的页地址(仅限页号,不保证数据内容仍有效)
- 结合innodb_buffer_pool_dump_pct控制保存比例(默认25%),避免dump文件过大
更可控的预热方式:
- 根据慢查询日志或performance_schema统计出高频访问的表和索引,针对性预热
- 用脚本循环执行SELECT * FROM table_name WHERE pk BETWEEN X AND Y LIMIT 1,分块触发主键范围读,减少锁和资源占用
- 对二级索引预热:SELECT indexed_col FROM table_name,配合FORCE INDEX确保走索引
注意事项
预热不是越快越好。全表扫描可能阻塞DDL、抢占IO带宽、引发buffer pool竞争。建议在低峰期执行,控制并发度,监控Innodb_buffer_pool_read_requests与Innodb_buffer_pool_reads比值,观察命中率是否快速回升。预热后可查information_schema.INNODB_BUFFER_POOL_STATS确认加载状态。










