PostgreSQL 扩展
问题
PostgreSQL 有哪些常用扩展?扩展机制的优势是什么?
答案
一、扩展机制
PostgreSQL 的 EXTENSION 机制允许以插件形式扩展数据库功能,无需修改核心代码:
-- 安装扩展
CREATE EXTENSION pgvector;
-- 查看已安装扩展
SELECT * FROM pg_extension;
-- 查看可用扩展
SELECT * FROM pg_available_extensions;
二、核心扩展
1. pg_stat_statements(性能分析必备)
CREATE EXTENSION pg_stat_statements;
-- 查看最耗时的 SQL
SELECT query, calls, total_exec_time, mean_exec_time, rows
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;
2. pgvector(向量搜索)
AI/RAG 场景中存储和检索 Embedding 向量:
CREATE EXTENSION vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536) -- OpenAI ada-002 的维度
);
-- 创建向量索引
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
-- 向量相似度搜索
SELECT content, embedding <=> '[0.1, 0.2, ...]'::vector AS distance
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 10;
3. PostGIS(地理空间)
CREATE EXTENSION postgis;
-- 查找附近 5km 内的店铺
SELECT name, ST_Distance(
location::geography,
ST_Point(116.4, 39.9)::geography
) AS distance
FROM shops
WHERE ST_DWithin(
location::geography,
ST_Point(116.4, 39.9)::geography,
5000 -- 5km
)
ORDER BY distance;
4. TimescaleDB(时序数据)
CREATE EXTENSION timescaledb;
-- 将普通表转为超表(hypertable)
SELECT create_hypertable('metrics', 'time');
-- 自动压缩、数据保留策略
SELECT add_compression_policy('metrics', INTERVAL '7 days');
SELECT add_retention_policy('metrics', INTERVAL '90 days');
三、常用扩展汇总
| 扩展 | 领域 | 说明 |
|---|---|---|
| pg_stat_statements | 监控 | SQL 性能统计 |
| pgvector | AI/向量 | 向量存储与相似度搜索 |
| PostGIS | GIS | 地理空间数据处理 |
| TimescaleDB | 时序 | 时序数据优化 |
| pg_trgm | 文本 | 模糊匹配(trigram 相似度) |
| uuid-ossp | 工具 | UUID 生成 |
| hstore | KV | 键值对数据类型 |
| pgcrypto | 安全 | 加密函数 |
| pg_partman | 管理 | 分区管理自动化 |
| Citus | 分布式 | 水平分片,分布式查询 |
| pgBouncer | 连接 | 连接池(独立组件) |
| pg_cron | 调度 | 定时任务 |
四、PostgreSQL 的生态优势
这也是 PostgreSQL 受欢迎的重要原因:一个数据库覆盖多种数据模型,减少架构中的组件数量。
常见面试问题
Q1: pgvector 支持哪些距离计算?
答案:
| 操作符 | 距离类型 | 索引类型 |
|---|---|---|
<-> | 欧氏距离(L2) | ivfflat / hnsw |
<=> | 余弦距离 | ivfflat / hnsw |
<#> | 内积(负) | ivfflat / hnsw |
HNSW 索引(0.5.0+)查询精度更高但构建更慢。
Q2: PostgreSQL 扩展和 MySQL 插件有什么区别?
答案:
- PostgreSQL 扩展可以添加 新数据类型、操作符、索引方法、函数,能力极强
- MySQL 插件主要是存储引擎、认证等,扩展 SQL 能力有限
- PostgreSQL 的扩展生态远比 MySQL 丰富