SuperAPI AI 工具集

postgres-patterns

数据与分析

查看项目

更新于 10-15 10:37

技能介绍

用途

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)需根据实际内存与负载调整。