在 CentOS 上提升数据库性能的核心思路是通过操作系统与数据库的多层缓存协同工作,尽量让“热点数据”留在内存中,减少磁盘 I/O 与网络往返。
操作系统层缓存
- 利用 Linux 的页面缓存 Page Cache自动加速文件读写:顺序扫描与热点数据会被自动缓存,通常无需手动调整。可通过以下方式观察与微调:
- 观察:
free -h、vmstat -s | grep cache 查看缓存命中情况。
- 适度降低回收压力(仅在确有写入尖峰或缓存抖动时考虑):
echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf && sysctl -p。
- 启用 DNS 缓存减少解析延迟:
sudo yum install -y nscd && sudo systemctl enable --now nscd,并按需配置 /etc/nscd.conf(如 enable-cache hosts yes、positive-time-to-live hosts 3600)。
- 若承载 Web 服务,启用 Nginx/Apache 代理或页面缓存,降低数据库读压(示例:
proxy_cache_path ...、CacheEnable disk /)。
数据库层缓存
- MySQL(InnoDB)
- 核心参数:将 innodb_buffer_pool_size 设为物理内存的50%–80%(专用库可更高),这是提升 InnoDB 读写性能最有效的手段。
- 连接与会话:合理设置 max_connections 与 open_files_limit,避免连接风暴与“打开文件过多”错误。
- 查询缓存:在 MySQL 5.7 及更早版本可启用 query_cache_type=1 / query_cache_size(如 32M–64M),并观察
Qcache_hits、Qcache_lowmem_prunes 等指标;当重复查询比例不高或写多读少时,关闭查询缓存可能更稳。
- MyISAM 表:如仍在使用,适当设置 key_buffer_size(只对 MyISAM 索引有效)。
- PostgreSQL
- 核心参数:设置 shared_buffers ≈ 25% 内存;按并发与排序/哈希操作调 work_mem(如 4MB 起,视负载逐步上调);维护类操作设 maintenance_work_mem(如 512MB)。
应用与中间层缓存
- 引入 Redis/Memcached 做热点数据、会话与计数器等应用层缓存,显著减少对数据库的直接访问次数。
- 结合 读写分离(主从复制)与连接池(合理最小/最大连接、超时与重试),平滑流量峰值并降低数据库瞬时压力。
监控与调优流程
- 基线评估:使用
SHOW STATUS LIKE 'Key_read%';、SHOW STATUS LIKE 'Qcache%';、SHOW STATUS LIKE 'Open%tables'; 等观察命中率与增长趋势;配合 MySQLTuner、Percona Toolkit 获取优化建议。
- 慢查询治理:开启慢查询日志,用
EXPLAIN 分析执行计划,优先优化全表扫描、缺失索引、大排序/大聚合等问题 SQL。
- 变更与回滚:任何参数调整遵循“备份—小步变更—压测—复盘”,在测试环境验证后再上线,并保留回滚方案。
内存与稳定性边界
- 避免“把内存吃满”:为操作系统与其他服务预留充足余量,否则可能触发 OOM Killer 终止 mysqld。内存紧张时可适度下调缓存参数,或关闭不必要的功能(如非必需的二进制日志)。
- 小内存实例(如 1GB)示例:可将 key_buffer_size 设为 16M–32M、query_cache_size 设为 16M–32M、table_open_cache 设为 128–256,并控制
max_connections 与每个连接的会话级缓冲,以降低 OOM 风险。