数据库 Cache / 缓冲池(Buffer Pool / Cache)调优 的核心目标只有一句话:让热点数据尽量留在内存里,减少磁盘 IO。下面按“思路 → 关键参数 → 实战方法 → 常见坑”来讲。
不同数据库叫法不同,但本质类似:
| 数据库 | Cache 名称 |
|---|---|
| MySQL | InnoDB Buffer Pool |
| PostgreSQL | shared_buffers |
| Oracle | SGA / DB Buffer Cache |
| Redis | 本身就是内存库(另说) |
| MongoDB | WiredTiger Cache |
下面以 MySQL / PostgreSQL 为主说明,思路通用。
命中率 = 1 - (物理读 / 逻辑读)
经验值:
MySQL 查看:
SHOW ENGINE INNODB STATUS;
-- Buffer pool hit rate
PostgreSQL:
SELECT * FROM pg_stat_database;
innodb_buffer_pool_size = 物理内存的 60%–80%
示例(64G 内存):
innodb_buffer_pool_size = 48G
✅ 原则:
innodb_buffer_pool_instances = 4~8
作用:减少锁竞争
innodb_max_dirty_pages_pct = 75
innodb_flush_neighbors = 0 # SSD 必开
# Linux
echo 1 > /proc/sys/vm/swappiness
或:
vm.swappiness = 1
shared_buffers = 25% 内存
(MySQL 比 PG 更激进)
PG 依赖 OS Cache,不要全占满
work_mem = 16MB~64MB # 排序/哈希用
参数调不好,SQL 烂也白搭
❌ 一上来就把 buffer 拉满
❌ 命中率低就加内存(可能是 SQL 问题)
❌ 忽略 SSD / IO 队列
❌ 开 Swap 不处理
如果你愿意,可以告诉我:
我可以直接给你一套可落地的参数配置。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。