一、硬件层面优化
shared_buffers、work_mem等)。max_worker_processes、max_parallel_workers_per_gather等参数与CPU核心数匹配。二、操作系统配置优化
/etc/sysctl.conf文件,优化以下参数:
vm.swappiness:降低至10-30(默认60),减少系统内存换页频率,避免频繁磁盘I/O;file-max:增加文件描述符上限(如file-max = 2097152),满足高并发下的文件句柄需求;kernel.shmmax/kernel.shmall:调整共享内存大小(shmmax设置为物理内存的70%-80%,shmall为shmmax/4096),确保PostgreSQL能分配足够共享内存。tune2fs调整日志参数,提升文件系统性能。三、PostgreSQL配置参数调优
shared_buffers:设置为物理内存的25%-40%(如8GB内存设为2GB),用于缓存表数据和索引,提高查询效率;work_mem:每个查询操作(如排序、哈希)的内存,建议设置为256MB-1GB(根据查询复杂度和并发量调整),避免内存不足导致磁盘临时文件使用;maintenance_work_mem:维护操作(如创建索引、VACUUM)的内存,建议设置为1GB-2GB,加快维护速度;effective_cache_size:操作系统可用的文件系统缓存大小,建议设置为物理内存的50%-75%,帮助查询优化器选择更优的执行计划。max_connections:根据应用需求设置(如不超过1000),避免过多连接导致资源竞争,建议使用连接池(如PgBouncer)管理连接;checkpoint_completion_target:设置为0.9(默认0.5),延长检查点写入时间,减少I/O峰值;random_page_cost:降低至1.1-2.0(默认4.0),让优化器更倾向于使用索引扫描(适用于SSD环境)。四、索引优化
WHERE user_id = 100 AND status = 'active'),创建复合索引(如(user_id, status)),提高查询效率。REINDEX命令重建碎片化索引(如REINDEX TABLE users;),使用ANALYZE命令更新索引统计信息,帮助优化器生成更优的执行计划。五、SQL查询优化
EXPLAIN ANALYZE命令查看查询的执行步骤(如全表扫描、索引扫描),识别性能瓶颈(如未使用索引、排序操作耗时)。SELECT *(只查询需要的列),减少不必要的子查询和连接(如用JOIN替代子查询),避免隐式类型转换(如WHERE id = '123'应改为WHERE id = 123,id为整数类型)。INSERT语句(如INSERT INTO logs VALUES ('msg1'), ('msg2');),或使用COPY命令从文件批量加载数据(如COPY logs FROM '/data/logs.csv' CSV;),减少事务开销,提升写入速度5-10倍。六、定期维护
VACUUM:清理表中的死行(如DELETE、UPDATE操作产生的旧数据),释放空间;ANALYZE:更新表的统计信息(如行数、分布),帮助查询优化器生成更准确的执行计划。建议开启autovacuum(默认开启),并根据表更新频率调整autovacuum_vacuum_threshold、autovacuum_analyze_threshold等参数。CREATE TABLE logs (id serial, created_at timestamp, message text) PARTITION BY RANGE (created_at);),减少查询扫描的数据量,提高查询性能。七、监控与分析
pg_stat_statements扩展(CREATE EXTENSION pg_stat_statements;),监控慢查询(如SELECT query, calls, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;),识别高频慢查询。