1. 硬件基础优化
2. PostgreSQL核心配置调优
shared_buffers:设置为系统总内存的25%-40%(如32GB内存可设为8GB-12GB),用于缓存表数据和索引,是PostgreSQL最重要的内存参数之一。work_mem:用于排序、哈希连接等操作的内存,建议设置为4MB-64MB(根据查询复杂度和并发量调整,如复杂分析查询可适当增大)。maintenance_work_mem:用于VACUUM、CREATE INDEX等维护操作的内存,建议设置为512MB-1GB(大表维护时可增大至2GB)。effective_cache_size:估计操作系统和PostgreSQL可用缓存的总内存,设置为系统总内存的50%-75%,帮助优化器做出更好的缓存决策。max_connections:根据应用需求和服务器资源调整(如小型应用设为50-100,大型应用设为200-500)。过多连接会导致内存耗尽,建议配合连接池(如PgBouncer)使用。checkpoint_segments(PostgreSQL 12+为max_wal_size):控制WAL(预写日志)文件的大小,增大该值可减少检查点频率,降低I/O压力(如设为1GB-2GB)。checkpoint_completion_target:设为0.9,让检查点更平缓地完成,减少对正常查询的影响。3. 索引策略优化
WHERE条件、JOIN操作或ORDER BY的列创建索引(如B-Tree索引适合等值查询和范围查询,Hash索引适合精确匹配)。WHERE col1 = x AND col2 = y),创建复合索引(如CREATE INDEX idx_col1_col2 ON table_name(col1, col2)),比单列索引更高效。REINDEX命令重建碎片化索引(如REINDEX TABLE table_name;),或在大量数据插入、删除后重建索引,保持索引效率。pg_stat_user_indexes视图分析索引使用情况,删除未使用或很少使用的索引。4. 查询性能优化
EXPLAIN(查看执行计划)或EXPLAIN ANALYZE(实际执行并显示统计信息)命令,找出慢查询的瓶颈(如全表扫描、排序操作耗时)。SELECT *(只查询需要的列),减少不必要的子查询(改用JOIN替代),避免ORDER BY与LIMIT组合时的全排序(如先通过索引过滤再排序)。max_parallel_workers_per_gather(如设为4-8),让PostgreSQL使用多个CPU核心并行处理查询,提升查询速度。WHERE UPPER(name) = 'JOHN')会导致索引失效,建议将函数应用于常量侧(如WHERE name = UPPER('john'))。5. 数据库维护管理
VACUUM命令清理表中的“死元组”(已删除或更新的行),释放空间并更新统计信息。对于频繁更新的表,可设置autovacuum自动执行(默认开启),或手动执行VACUUM VERBOSE table_name;。ANALYZE命令收集表和索引的统计信息,帮助查询优化器做出更好的决策。建议定期执行(如每天一次),或在大量数据变更后执行(如ANALYZE VERBOSE table_name;)。pg_stat_user_indexes查看avg_leaf_density指标,低于50%需重建),使用REINDEX命令(如REINDEX INDEX idx_name;)。PARTITION分区表,按时间分区后直接删除旧分区),减少表的大小,提升查询性能。6. 连接池与高可用优化
pool_mode = transaction(事务池模式,适合大多数应用)、max_client_conn = 1000(最大客户端连接数)、default_pool_size = 20(每个客户端的默认连接池大小)。wal_level = replica、max_wal_senders = 2,在从库配置hot_standby = on,然后启动从库同步。7. 监控与持续优化
pg_stat_activity查看当前数据库活动(如连接数、执行的查询),pg_stat_statements查看最耗资源的查询(需开启track_activities = on、track_statements = on),pg_stat_bgwriter查看后台写入情况(如检查点、WAL写入)。shared_buffers、调整work_mem),确保配置适应当前负载。