分享悉尼服务器 PostgreSQL 数据库的性能优化实战,从参数配置到查询优化的完整指南。
PostgreSQL 是功能强大的开源数据库。本文分享悉尼服务器 PostgreSQL 性能优化实战。
参数调优 1) shared_buffers:物理内存的 25%,如 32G 内存设 8G 2) effective_cache_size:物理内存的 50-75%,查询优化器参考 3) work_mem:排序和哈希操作的内存,默认 4MB 太小,可设 64MB 4) maintenance_work_mem:VACUUM、CREATE INDEX 的内存,设 1-2G 5) checkpoint_timeout:15-30 分钟,减少 checkpoint 频率 6) wal_buffers:16MB,WAL 缓冲区 7) max_connections:根据实际需要,避免过多
索引优化 1) 为 WHERE、JOIN、ORDER BY 字段建索引 2) 复合索引遵循最左前缀 3) 部分索引:只索引满足条件的行 4) 表达式索引:对函数结果建索引 5) 定期分析:ANALYZE 更新统计信息 6) 监控慢查询:log_min_duration_statement
查询优化 1) 用 EXPLAIN ANALYZE 分析执行计划 2) 避免 SELECT *,只查需要的列 3) 避免 N+1 查询,用 JOIN 代替循环查询 4) 分页用游标或 keyset,避免 OFFSET 大偏移 5) 用 CTE 或子查询优化复杂查询 6) 批量操作,减少往返
连接池 1) PgBouncer:事务级连接池 2) 配置 pool_size,避免数据库连接数过多 3) 客户端复用连接 4) 监控连接池使用情况
分区表 1) 按时间范围分区:日、月分区 2) 按哈希分区:均匀分布 3) 分区裁剪:查询自动只扫相关分区 4) 冷热数据分离:旧分区迁移到慢存储
VACUUM 和膨胀 1) 开启 autovacuum,合理调整阈值 2) 大表定期 VACUUM FULL 回收空间 3) 监控死元组比例 4) 膨胀严重时考虑 pg_repack
高可用 1) 流复制:主从异步复制 2) 自动故障转移:Patroni、repmgr 3) 备份:pg_basebackup + WAL 归档 4) 时间点恢复(PITR)
监控指标 1) 连接数:当前连接 vs 最大连接 2) 缓存命中率:shared_buffers 命中率 > 99% 3) 慢查询:执行时间、次数 4) 表膨胀:死元组比例 5) 锁等待:长事务导致的锁 6) 复制延迟:主从延迟时间
常见问题 问题一:查询突然变慢 排查:执行计划是否改变;统计信息是否过期;是否有锁。 修复:ANALYZE;重建索引;终止长事务。
问题二:连接数打满 排查:是否有连接泄漏;是否有慢查询占满连接。 修复:PgBouncer;优化慢查询;调大 max_connections。
问题三:磁盘 IO 高 排查:是否有全表扫描;checkpoint 是否频繁。 修复:添加索引;调整 checkpoint;升级 SSD。
问题四:VACUUM 慢 排查:表是否太大;是否有长事务。 修复:分区表;终止长事务;并行 VACUUM。
总结:PostgreSQL 优化要综合参数、索引、查询、连接池。定期监控和分析,才能持续保持高性能。