缓冲池大小怎么定
缓冲池是 InnoDB 最值钱的内存配置:数据页与索引页都缓存在这里,命中就免去磁盘 IO。它的大小直接决定热数据能否常驻内存,专用数据库实例一般取物理内存的百分之五十到七十五,剩下的要留给连接内存与操作系统缓存。参数可以在线调整,扩容以小步上调为主,缩容需要重整缓冲池,不适合在业务高峰做。
基本信息
| 用途 | 设置 InnoDB 缓冲池大小 |
|---|---|
| 取值单位 | 字节,支持 K / M / G 后缀 |
| 建议取值 | 专用库取物理内存的百分之五十到七十五 |
| 在线调整 | 支持动态修改,按分块粒度对齐 |
| 相关参数 | 分块大小与缓冲池实例个数 |
| 观察指标 | 空闲页、脏页与物理读次数 |
典型使用场景
- 新实例规划内存:先定缓冲池,再定连接数与每连接内存
- 磁盘读偏高时确认缓冲池能不能装下热数据
- 内存扩容后按比例上调缓冲池,观察命中率变化
- 多实例共存的机器按业务重要性分配缓冲池
- 排查内存溢出:核对缓冲池加连接内存是否超出物理内存
- 升降配前的容量评估:确认目标规格下缓冲池的合理上限
查看与调整
查看与调整
SELECT @@innodb_buffer_pool_size/1024/1024/1024 AS gb; # 当前缓冲池大小(GB)
SET GLOBAL innodb_buffer_pool_size = 8589934592; # 在线调大为 8G
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%'; # 观察物理读与逻辑读分块与使用情况
分块与使用情况
SELECT @@innodb_buffer_pool_instances, @@innodb_buffer_pool_chunk_size; # 分块信息,决定调整粒度
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages%'; # 页面状态:空闲页、脏页、总页数
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests'; # 逻辑读次数,与物理读配合算命中率相关指标读法
| 指标 | 含义 | 判读要点 |
|---|---|---|
| 缓冲池大小 | 当前分配的内存 | 与物理内存的比例是否合理 |
| 空闲页 | 尚未使用的页面 | 长期为零说明热数据已顶到上限 |
| 脏页 | 尚未刷盘的数据页 | 占比过高会带来刷盘压力 |
| 物理读次数 | 未能命中缓存而读磁盘 | 持续增长说明缓存不足 |
| 逻辑读次数 | 从缓存读取页面的次数 | 与物理读对比可算命中率 |
| 等待空闲页 | 因缺少空闲页而等待 | 出现说明需要扩容或降低并发 |
| 分块大小与实例数 | 决定在线调整的粒度 | 设置值会按分块向上取整 |
在线调整按分块粒度对齐,设置值会被向上取整;缩容需要重整缓冲池,业务高峰不要做,扩容也建议小步增量并观察效果。
缓冲池不是越大越好:把九成内存都给它,连接的排序缓冲、临时表与操作系统缓存就没有空间,机器会因内存不足被拖垮。
只在配置文件里改了参数、既没重启也没在线执行设置,参数不会生效;改完要用查询确认当前值,别凭改动记录下结论。
内存规划清单
- 先定缓冲池,再按业务并发确定连接数上限
- 为每个连接预留排序与连接缓冲内存
- 给操作系统留足缓存与基础运行空间
- 多实例机器按业务重要性分配,避免互相挤压
- 上线后监控物理读与空闲页变化,按需微调
- 内存调整纳入变更记录并做参数固化
缓冲池只缓存页数据,不缓存结果集:同一条语句即使缓存命中,仍要执行计算与排序,慢语句优化依旧要回到索引与写法上,别指望加内存解决所有性能问题。