核心用法
PostgreSQL技能专注于数据库性能优化与架构设计,提供从索引创建到连接池配置的完整实践指南。
索引策略
- 部分索引:
WHERE active = true可减少80%索引大小,适合状态列 - 表达式索引:
ON lower(email)必须精确匹配查询,否则触发全表扫描 - 覆盖索引:
INCLUDE (name, email)实现索引唯一扫描,减少Heap Fetches - 复合索引顺序:
(a, b)仅支持WHERE a = ?,不支持WHERE b = ? - 外键索引:PostgreSQL不自动创建,JOIN和级联删除必需
查询模式
SELECT FOR UPDATE SKIP LOCKED:实现无外部工具的分布式任务队列pg_advisory_lock(key):应用级互斥锁,无需建表IS NOT DISTINCT FROM:NULL安全比较,替代冗长条件DISTINCT ON (x) ORDER BY x, y:每组首行查询,PG特有高效语法
连接与资源管理
- PgBouncer:>50连接必需,事务级连接池,每连接约10MB内存
- 超时配置:
statement_timeout防失控查询,idle_in_transaction_session_timeout清理僵尸事务 - max_connections:默认100过低,需按RAM调优
数据类型规范
SERIAL已弃用,改用GENERATED ALWAYS AS IDENTITYTIMESTAMPTZ替代无时区TIMESTAMP,内部存UTC- 金额用
NUMERIC(12,2)或整数分,避免浮点精度问题 TEXT与VARCHAR(n)性能无差异,无需强制长度限制
维护与监控
VACUUM ANALYZE批量插入后必需,更新统计信息pg_repack无损清理膨胀表,无锁回收空间- 监控事务回卷(xid耗尽),autovacuum需调优大表
EXPLAIN分析
- 始终使用
EXPLAIN (ANALYZE, BUFFERS)获取实际执行时间与I/O - "Heap Fetches"高说明需覆盖索引,顺序扫描>10%数据时可能更优
显著优点
- 生产级深度:涵盖从开发到运维的全生命周期,非基础教程
- 性能导向:每个建议附带量化指标(80%更小、10MB/连接、>10-20%阈值)
- PG特性充分利用:DISTINCT ON、advisory lock等独特功能
- 反模式警示:明确标注废弃实践(SERIAL、无timezone时间戳、float金额)
潜在缺点与局限性
- 版本依赖:部分特性需较新PG版本(如GENERATED ALWAYS AS IDENTITY)
- 场景特定:PgBouncer建议基于">50连接"阈值,小型项目可能过度
- 无分布式覆盖:未涉及Patroni、Citus等高可用/扩展方案
- 调参需测试:autovacuum等参数需结合实际负载验证
适合人群
- 有SQL基础的中高级后端开发者
- 负责PG运维的DBA或SRE
- 从MySQL/MSSQL迁移至PG的工程师
- 需要优化现有慢查询的维护团队
常规风险
- 索引滥用:未使用的索引拖慢写入,需定期审查
pg_stat_user_indexes - 锁竞争:长事务阻塞vacuum,建议控制在秒级
- 连接泄漏:未配置idle超时导致资源耗尽
- 统计过期:大表未ANALYZE导致执行计划错误