Postgres 扩展推荐

Mortar 用 Postgres 做 database primitive 的存储。Postgres 标准库 够用,但几个扩展能显著提升 Mortar 用户的应用质量。这里列出 Mortar 团队主动测过 + 推荐启用的扩展,每个扩展给出用途、安 装方式、何时该用。

推荐启用清单

扩展用途建议安装时机
pgvector向量嵌入(RAG / 语义搜索)任何 AI 应用
pg_partman时间序列表自动分区单表 > 1 千万行
pg_search全文搜索(替代 tsvector 简化)FTS 流量 < 10 QPS
pg_cron数据库内 cron 调度业务逻辑跟 schema 强绑定时
pg_stat_statements慢查询分析所有生产环境必装
pgauditDDL / 数据访问审计等保 / SOC 2 合规要求
pg_trgm模糊匹配(拼写容错搜索)中文混拼搜索
zhparser中文分词(搭配 pg_search / tsvector中文 FTS

启用方式

Mortar 自带的 RDS 实例没有自动启用任何扩展——按需打开。SaaS 共享集群(当前默认)允许用户自助 CREATE EXTENSION 这些 扩展。独立 RDS(规划中,Large+ tier)+ BYOC(规划中) 用户的 DBA 有更完整的权限。

-- 在你的 project tenant schema 下
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- pg_stat_statements 必须 superuser,Mortar 平台预装在所有共享池

用例 + 示例

pgvector — 语义搜索 + RAG

详见 rag-cookbook.md。简版:

CREATE EXTENSION vector;
ALTER TABLE docs ADD COLUMN embedding vector(1536);
CREATE INDEX ON docs USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

-- top-K nearest
SELECT id, content FROM docs ORDER BY embedding <=> '[0.1, 0.2, ...]' LIMIT 10;

pg_partman — 时序分区

CREATE EXTENSION pg_partman;
SELECT partman.create_parent(
  'public.events',
  'created_at',
  'native',
  'monthly'
);

适合 events / audit_log / messages 这类只插入 + 按时间查询的表。 减少索引大小、加速 WHERE created_at > now() - interval '7 days' 类查询。

pg_trgm — 模糊搜索

CREATE EXTENSION pg_trgm;
CREATE INDEX ON users USING gin (display_name gin_trgm_ops);

SELECT * FROM users WHERE display_name % 'zhang san' ORDER BY similarity(display_name, 'zhang san') DESC LIMIT 10;

对中英文混合 + 拼写错误友好。配合 zhparser 能搜中文。

zhparser — 中文分词

CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION cn (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION cn ADD MAPPING FOR n,v,a,i,e,l WITH simple;

-- 用法
SELECT * FROM articles WHERE to_tsvector('cn', body) @@ to_tsquery('cn', '深度学习 & 神经网络');

pg_search 比的优劣:原生 tsvector 慢但简单;pg_search 快但 需独立 worker。中等规模(< 1 千万行)选原生 + zhparser。

pg_stat_statements — 必装

CREATE EXTENSION pg_stat_statements;
SELECT query, calls, mean_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 20;

慢查询 hit list。生产环境无脑装

不推荐的扩展

扩展为什么不推荐
plv8JavaScript in Postgres — 想用 JS 跑业务逻辑应该用 Mortar 的 compute primitive(Aliyun FC / Tencent SCF),不要扔进数据库里。
postgres_fdw跨库 join — 设计的是数据架构问题,不是 SQL 问题;切片到合适的 primitive 边界更值。
pg_hint_plan强制 query plan — 性能问题大多是索引缺失 + 数据形状不对,不是 planner bug;先 EXPLAIN 再说。

规划中的扩展支持

multi-region(规划中):每个 region 独立的 Postgres,扩展配置同步。 enterprise(规划中):客户自带 RDS,可以装任何扩展;Mortar 控制平面只查 pg_extension 系统视图判断启用项,不强制版本。

参考