1. 存储硬件选择与配置
优先使用SSD/NVMe存储替代传统HDD,显著提升随机I/O性能(如每秒输入/输出操作数IOPS),尤其适合PostgreSQL的高并发随机读写场景。若使用SSD,可将random_page_cost参数从HDD的默认4.0调整为1.1-1.5,让查询优化器更倾向于选择索引扫描而非全表扫描。对于高可用或高负载环境,推荐采用RAID 10(条带化+镜像)配置,兼顾存储冗余与读写性能;避免使用RAID 5,因其写入性能较差,会增加数据库负载。
2. 关键参数调优
checkpoint_timeout:增大至15-30分钟(默认5分钟),减少检查点频率,降低I/O峰值;checkpoint_completion_target:设置为0.9,使检查点I/O更均匀地分布在间隔内,避免突发负载;max_wal_size:增大至2-4GB(默认1GB),配合checkpoint_timeout减少检查点次数。wal_compression(wal_compression = on),减少WAL日志写入量;将WAL日志与数据文件放在不同磁盘(如WAL用NVMe,数据用SSD),分散I/O压力。3. 数据分区与归档
CREATE TABLE sales (id serial, sale_date date, amount numeric) PARTITION BY RANGE (sale_date);,再创建按月分区表。CREATE TABLE sales_archive AS SELECT * FROM sales WHERE sale_date < '2024-01-01';),减小活跃表的大小,降低查询I/O负载。4. 缓存策略
pg_prewarm(CREATE EXTENSION pg_prewarm;),将频繁访问的数据预加载到内存中(如SELECT pg_prewarm('hot_table');),减少数据库重启或冷启动后的磁盘I/O。5. 自动维护优化
autovacuum_vacuum_cost_delay(如20ms)、autovacuum_vacuum_cost_limit(如2000),让autovacuum更积极地清理死元组,避免表膨胀。同时,增大maintenance_work_mem(如256MB-1GB),加速VACUUM和索引创建操作。pg_stat_bgwriter查看后台写入活动,pg_stat_user_indexes监控索引使用率,及时清理冗余索引(如未使用的索引会增加写入负载)。6. 查询与索引优化
EXPLAIN ANALYZE分析查询执行计划,确保查询使用索引(如B-tree索引适用于等值查询和范围扫描)。避免在WHERE子句中对字段进行函数计算(如WHERE lower(name) = 'john'),否则会导致索引失效。INSERT INTO table VALUES (...), (...), ...;),减少磁盘写入次数。work_mem以减少排序和哈希操作的磁盘使用;拆分复杂CTE(公用表表达式)为临时表,避免优化器误判执行计划。