pgvector 入门
8 分钟阅读 · 更新于 2026-05-29T04:34:26.234808Z · #pgvector #postgres #rag
概览
pgvector 是 PostgreSQL 的向量扩展,把向量存储和相似度检索内置到关系库里。对于「数据已经在 Postgres」的团队,它消除了再维护一个专用向量库的运维成本。
不是所有人都需要 Pinecone / Weaviate / Milvus。如果你的向量量在千万级以内、QPS 在三位数以内、且数据已经在 Postgres —— pgvector 极可能是更优解。
安装
CREATE EXTENSION IF NOT EXISTS vector;
大部分托管 PG(Supabase、Neon、RDS 16+)已经预装,直接 CREATE EXTENSION 即可。
建表
CREATE TABLE items (
id bigserial PRIMARY KEY,
content text,
embedding vector(1536)
);
维度要和你用的嵌入模型一致;OpenAI text-embedding-3-small 是 1536。
写入
INSERT INTO items (content, embedding) VALUES
('...', '[0.1, 0.2, ...]');
索引选型
ivfflat
经典的倒排聚类索引。建索引快、查询稍慢,需要先 ANALYZE 提供数据分布。
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
lists 经验值 ≈ √行数。查询时 SET ivfflat.probes = 10 控制召回精度 / 速度 trade-off。
hnsw
pgvector 0.5+ 支持。图索引,读快写慢,内存占用大。
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
查询时 SET hnsw.ef_search = 40 调速度精度。
选哪个
| 场景 | 推荐 |
|---|---|
| 数据量 < 100 万 + 写多 | ivfflat |
| 数据量 > 100 万 + 读多 | hnsw |
| 内存紧张 | ivfflat |
| 召回延迟敏感 | hnsw |
查询
SELECT content, 1 - (embedding <=> $1) AS similarity
FROM items
ORDER BY embedding <=> $1
LIMIT 10;
<=> 是余弦距离(值越小越近)。<-> 欧氏距离、<#> 负内积也可用。
性能
实测 50 万向量 + ivfflat (lists=200, probes=10) 在 16C/32G 机器上 ~ P95 23ms / 1.2k QPS。比专用向量库性能略低,但数据一致性 / 事务 / join 能力是巨大加分项。
不适合
- 亿级向量(专用库更稳)
- 强实时(毫秒级)大规模流式写入
- 多租户隔离要求强(pg 分区是答案,但运维复杂)