用途
PostgreSQL Patterns 是一份 PostgreSQL 最佳实践快速参考,用于在数据库开发与运维中快速查阅索引、数据类型、常见查询模式、反模式检测和配置建议。它基于 Supabase 最佳实践整理,适合在编写 SQL 查询或迁移、设计数据库模式、排查慢查询、实现行级安全(RLS)以及设置连接池时使用。如需更详细的指导,可配合 database-reviewer 智能体使用。
主要能力
索引速查表
按查询模式给出推荐索引类型与示例:
WHERE col = value:B-tree(默认),CREATE INDEX idx ON t (col)WHERE col > value:B-tree,CREATE INDEX idx ON t (col)WHERE a = x AND b > y:复合索引,CREATE INDEX idx ON t (a, b)WHERE jsonb @> '{}':GIN,CREATE INDEX idx ON t USING gin (col)WHERE tsv @@ query:GIN,CREATE INDEX idx ON t USING gin (col)- 时间序列范围:BRIN,
CREATE INDEX idx ON t USING brin (col)
数据类型速查
- ID:使用
bigint,避免int、随机 UUID - 字符串:使用
text,避免varchar(255) - 时间戳:使用
timestamptz,避免timestamp - 金额:使用
numeric(10,2),避免float - 标志:使用
boolean,避免varchar、int
常见模式
- 复合索引顺序:等值列在前,范围列在后。示例:
CREATE INDEX idx ON orders (status, created_at);适用于WHERE status = 'pending' AND created_at > '2024-01-01'。 - 覆盖索引:
CREATE INDEX idx ON users (email) INCLUDE (name, created_at);可避免SELECT email, name, created_at时的回表查询。 - 部分索引:
CREATE INDEX idx ON users (email) WHERE deleted_at IS NULL;索引更小,仅包含活跃用户。 - RLS 策略(优化):
CREATE POLICY policy ON orders USING ((SELECT auth.uid()) = user_id);注意用 SELECT 包裹。 - UPSERT:
INSERT INTO settings (user_id, key, value) VALUES (123, 'theme', 'dark') ON CONFLICT (user_id, key) DO UPDATE SET value = EXCLUDED.value; - 游标分页:
SELECT * FROM products WHERE id > $last_id ORDER BY id LIMIT 20;复杂度 O(1),优于 OFFSET 的 O(n)。 - 队列处理:
UPDATE jobs SET status = 'processing' WHERE id = (SELECT id FROM jobs WHERE status = 'pending' ORDER BY created_at LIMIT 1 FOR UPDATE SKIP LOCKED) RETURNING *;
反模式检测
- 查找未索引外键:通过
pg_constraint与pg_attribute联查,筛选contype = 'f'且不存在对应索引的记录。 - 查找慢查询:
SELECT query, mean_exec_time, calls FROM pg_stat_statements WHERE mean_exec_time > 100 ORDER BY mean_exec_time DESC; - 检查表膨胀:
SELECT relname, n_dead_tup, last_vacuum FROM pg_stat_user_tables WHERE n_dead_tup > 1000 ORDER BY n_dead_tup DESC;
配置模板
- 连接限制(按内存调整):
ALTER SYSTEM SET max_connections = 100;、ALTER SYSTEM SET work_mem = '8MB'; - 超时:
ALTER SYSTEM SET idle_in_transaction_session_timeout = '30s';、ALTER SYSTEM SET statement_timeout = '30s'; - 监控:
CREATE EXTENSION IF NOT EXISTS pg_stat_statements; - 安全默认值:
REVOKE ALL ON SCHEMA public FROM public; - 应用配置:
SELECT pg_reload_conf();
使用方式
该技能以快速参考形式提供,可在编写 SQL、设计模式或排查性能问题时直接查阅对应章节。具体安装命令与调用方式暂未提供。
适用场景
- 编写 SQL 查询或数据库迁移
- 设计数据库模式
- 排查慢查询
- 实现行级安全(RLS)
- 设置连接池
限制
资料未提供具体的安装命令、调用方式、收费信息、平台支持范围及效果保证。相关配置参数(如 max_connections、work_mem)需根据实际内存与负载调整。