PostgreSQL 优化
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/postgres-optimization-fi00。
技能介绍
解决什么问题
PostgreSQL 默认配置能跑起来,但数据量和查询复杂度上升后,性能问题往往集中在几个固定位置:本该走索引的查询在执行全表扫描;大表上的排序和聚合消耗大量内存与磁盘;JSONB 被当作万能存储;连接数上涨后内存被迅速吃掉。这个技能把排查这些问题的思路整理成一份可执行的优化指南。
核心能力与关键步骤
- 索引策略:从查询计划里定位
Seq Scan、高代价的Nested Loop和缺失排序索引的Sort,并依据pg_stat_statements判断真实查询模式,而不是凭猜测建索引。 - 查询计划解读:关注行数估算是否失真、
Sort发生在内存还是磁盘,以及Buffers中shared hit与shared read的比例,判断缓存是否有效。 - 分区:对超过 1000 万行、且查询稳定过滤分区键的表引入分区。
- JSONB 操作:给出 JSONB 的常规使用边界,避免把大对象塞进字段。
- 连接池:Web 应用使用事务级池化;依赖预编译语句或临时表的应用使用会话级池化。
- 参数调优与反模式:指出常见做法为什么有害,例如每列都建索引、滥用
SELECT *、忽略EXPLAIN ANALYZE、缺少连接池导致每个连接占用约 10MB 内存、以及在高峰期执行VACUUM FULL锁住整表。
适用边界
- 技能提供的是优化框架和核对清单,不会自动修改数据库,需要自己运行
EXPLAIN ANALYZE验证效果。 - 组合索引的列顺序建议遵循等值、排序、范围的顺序,但最终要回归真实执行计划确认。
- 建议先在测试库验证再上线,避免把调优变成新的不稳定因素。
- 末尾的检查清单可以直接作为 code review 或运维巡检的核对项使用。
使用场景
- 线上查询变慢,需要通过 `EXPLAIN ANALYZE` 判断是否缺少索引或排序落盘。
- 大表超过千万行后查询只命中少数分区,想评估是否引入分区键。
- 数据库内存上涨,想确认连接池配置是否适合当前事务或预编译语句用法。
- 历史库堆积了冗余索引,需要对照 `pg_stat_statements` 找出未使用的索引并清理。
适合人员
- 负责 PostgreSQL 调优的后端工程师,需要定位慢查询并给出可验证的优化方案。
- 管理生产数据库的 DBA,要在上线前复核索引、连接池与分区配置。
- 编写数据访问层的工程师,想避免常见反模式导致上线后性能回退。
- 维护高并发服务的工程师,需要判断当前连接池策略是否匹配业务模型。