1. 硬件与操作系统基础优化
vm.swappiness(建议设为10以下),减少系统内存换页频率,避免频繁磁盘I/O;通过ulimit -n提高文件描述符上限,支持更多并发连接。2. 数据库核心配置调优
shared_buffers:设置为物理内存的25%-40%(如64GB内存服务器可设为16GB),用于缓存表数据和索引,减少磁盘读取次数。work_mem:每个查询操作(如排序、哈希连接)的专用内存,建议初始值为总内存/(max_connections×2)(如max_connections=100时,设为64MB),避免单个查询占用过多内存。maintenance_work_mem:维护操作(如创建索引、VACUUM)的专用内存,建议设为1GB及以上(大内存服务器可设为4GB),提升维护效率。effective_cache_size:估计操作系统可用的文件系统缓存大小,建议设为物理内存的50%-75%,帮助查询优化器判断是否使用索引。max_connections:根据硬件资源限制并发连接数(如100-200),避免过多连接导致资源竞争;建议配合PgBouncer连接池使用,复用连接降低开销。checkpoint_completion_target:设为0.9(接近1),平滑WAL日志写入压力,减少检查点对性能的影响。wal_buffers:设为shared_buffers的1/32(如shared_buffers=16GB时,设为512MB),优化WAL数据缓冲。3. 索引策略优化
REINDEX命令重建碎片化索引(如每月一次),提升索引查询效率;使用pg_stat_user_indexes视图监控索引使用情况,删除未使用或低使用率的冗余索引,减少维护成本。4. SQL查询性能优化
EXPLAIN(查看逻辑执行计划)或EXPLAIN ANALYZE(查看实际执行计划)命令,识别查询瓶颈(如全表扫描、排序操作),针对性优化。SELECT *(仅查询所需列),减少数据传输量;优化JOIN操作(如小表驱动大表),避免嵌套子查询(可改用CTE或临时表);避免在查询条件中对列使用函数(如WHERE UPPER(name) = 'JOHN'),防止索引失效。WHERE id > last_id LIMIT 10),避免OFFSET导致的性能下降(OFFSET越大,扫描行数越多)。5. 定期维护与监控
VACUUM(清理死元组,回收空间)和ANALYZE(更新统计信息,帮助优化器制定更好查询计划),建议开启autovacuum自动维护(默认开启),并根据负载调整autovacuum_vacuum_scale_factor(如设为0.1,表数据变化10%时触发)和autovacuum_analyze_scale_factor(如设为0.05,表数据变化5%时触发)。REINDEX(如每季度一次),消除索引碎片,提升查询效率。pg_stat_activity(查看当前活动连接)、pg_stat_statements(统计SQL执行频率和耗时)、pg_stat_bgwriter(监控后台写入情况)等视图,实时监控数据库状态。