强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

PostgreSQL 完全指南 / 22 - 最佳实践

第 22 章 · 最佳实践

本章汇总生产环境的连接池策略、SQL 编码规范、VACUUM 策略和上线 Checklist。


22.1 连接池最佳实践

参数推荐值说明
PgBouncer pool_modetransaction最高复用率
default_pool_size20-50每个数据库的连接池大小
max_client_conn1000-5000最大客户端连接数
server_idle_timeout300-600空闲后端连接超时
server_lifetime3600后端连接最大生存时间
PG max_connections200-500不超过 500
应用连接数 = max_client_conn (PgBouncer)
实际 PG 连接数 = default_pool_size × 数据库数

22.2 SQL 编码规范

命名规范

对象规则示例
表名小写 + 下划线user_orders
列名小写 + 下划线created_at
主键id表名_idid, order_id
外键引用表名_idcustomer_id
索引idx_表名_列名idx_orders_customer
唯一索引uniq_表名_列名uniq_users_email
约束chk_表名_描述chk_orders_positive_amount
触发器trg_表名_事件trg_users_update_timestamp
函数小写 + 下划线calculate_total()

SQL 编写规范

-- ✅ 关键字大写
SELECT id, name, email
FROM users
WHERE is_active = TRUE
ORDER BY created_at DESC
LIMIT 20;

-- ✅ 使用显式列名,避免 SELECT *
SELECT id, name, email FROM users;

-- ✅ 使用参数化查询,避免 SQL 注入
-- cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

-- ✅ 使用 TIMESTAMPTZ
CREATE TABLE events (
    created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
);

-- ✅ 外键必须有索引
CREATE TABLE orders (
    customer_id INT REFERENCES customers(id)
);
CREATE INDEX idx_orders_customer ON orders (customer_id);

-- ✅ 大批量操作使用事务
BEGIN;
INSERT INTO ...;
INSERT INTO ...;
COMMIT;

-- ✅ 使用 EXPLAIN ANALYZE 验证慢查询

22.3 VACUUM 策略

autovacuum 配置

# postgresql.conf
autovacuum = on
autovacuum_max_workers = 3               # 并行工作者数
autovacuum_naptime = 1min                # 检查间隔
autovacuum_vacuum_threshold = 50         # 最少死行数
autovacuum_vacuum_scale_factor = 0.1     # 死行比例(10%)
autovacuum_analyze_threshold = 50
autovacuum_analyze_scale_factor = 0.05   # 分析阈值(5%)
autovacuum_vacuum_cost_delay = 2ms       # IO 限制延迟
autovacuum_vacuum_cost_limit = 200       # IO 限制

大表特殊配置

-- 为大表设置更低的触发阈值
ALTER TABLE large_table SET (
    autovacuum_vacuum_scale_factor = 0.01,  -- 1% 死行就触发
    autovacuum_analyze_scale_factor = 0.005,
    autovacuum_vacuum_cost_delay = 0        -- 不限速
);

监控 VACUUM

-- 查看表的 VACUUM 状态
SELECT
    relname,
    n_live_tup,
    n_dead_tup,
    round(n_dead_tup::numeric / NULLIF(n_live_tup + n_dead_tup, 0) * 100, 2) AS dead_pct,
    last_vacuum,
    last_autovacuum,
    last_analyze,
    last_autoanalyze
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

-- 查看正在进行的 VACUUM
SELECT pid, query, state, wait_event_type, wait_event
FROM pg_stat_activity
WHERE query LIKE 'autovacuum:%';

22.4 生产环境 Checklist

部署前

检查项
PostgreSQL 版本为最新稳定版
shared_buffers 设置为总内存的 25%
effective_cache_size 设置为总内存的 75%
work_mem 合理设置(4-64MB)
max_connections 不超过 500
wal_level = replica
random_page_cost = 1.1(SSD)
log_min_duration_statement = 1000(记录慢查询)
autovacuum 已启用并正确配置
pg_hba.conf 安全配置(无 trust)
SSL 已启用
复制用户权限最小化

运维中

检查项
每日备份验证
监控复制延迟
监控表膨胀率
监控连接数
监控缓存命中率
定期 ANALYZE
定期清理无用索引
事务 ID 年龄监控
WAL 文件数量监控
慢查询定期审查

22.5 配置参数速查

参数4GB 内存16GB 内存64GB 内存
shared_buffers1GB4GB16GB
effective_cache_size3GB12GB48GB
work_mem8MB32MB64MB
maintenance_work_mem256MB1GB2GB
wal_buffers64MB64MB64MB
max_connections200300500
max_wal_size2GB4GB8GB
random_page_cost1.11.11.1

业务场景

场景建议
新项目上线参照 Checklist 逐项检查
性能调优pg_stat_statements + EXPLAIN ANALYZE
容量规划监控增长趋势 + 压测拐点
事故复盘日志 + pg_stat_activity + 锁信息

扩展阅读