两者到底有什么不同?
先给个结论性的对比:
| 对比维度 | pgvector | Milvus |
|---|---|---|
| 本质 | PostgreSQL的一个扩展插件 | 专为向量打造的独立分布式数据库 |
| 设计理念 | 在关系型数据库里“顺便”做向量检索 | 把向量检索做到极致 |
| 适合数据量 | ≤500万条 | 千万级到百亿级 |
| 运维复杂度 | ★☆☆☆☆(极低) | ★★★★☆(较高) |
| 典型场景 | 已有PostgreSQL的中小项目 | 大规模、高性能AI应用 |
如果用一个比喻来理解:pgvector就像在你的家庭小厨房里加了一台空气炸锅,偶尔炸个薯条完全够用,还不占地方。
Milvus则像一个专业的中央厨房,能同时处理几百桌订单,但你需要单独租场地、雇人、维护设备。
二、它们到底是怎么做向量检索的?
在对比之前,我们先搞懂一个核心问题:向量检索的本质是什么?
向量检索就是在一堆高维空间里的点中,找到离目标点最近的K个点。
如果暴力计算(把所有点都算一遍),数据量一大就慢如蜗牛。
所以,必须用索引来加速——就像书的目录,让你不用翻完整本书就能找到内容。
pgvector和Milvus都采用了两种主流索引:IVF(倒排文件索引)和HNSW(分层导航小世界)。
但它们的实现方式和优化方向完全不同。
2.1 pgvector的索引原理
pgvector直接在PostgreSQL的存储引擎之上增加了一种新的数据类型vector,并利用PostgreSQL的索引接口实现了IVFFlat和HNSW索引。
IVFFlat原理图:
HNSW原理图:
pgvector把这两种索引算法“塞进”了PostgreSQL的B-tree索引框架中。
好处是:你创建索引的语法和普通B-tree几乎一样,PostgreSQL的查询优化器能自动决定是否使用向量索引。
但缺点也很明显——pgvector不能利用多核并行扫描,也无法使用GPU加速,因为PostgreSQL本身不支持这些特性。
2.2 Milvus的索引原理
Milvus是为向量检索从头设计的系统,它的索引层是一个独立的、高度优化的模块。
Milvus整体架构:
Milvus的索引节点可以并行构建索引,查询节点可以并发执行搜索。它支持10+种索引算法,包括:
- HNSW:基于图的索引,查询快,内存占用大
- IVF_FLAT:聚类+全精度,召回率高
- IVF_PQ:乘积量化,内存压缩8-16倍
- GPU索引:利用CUDA加速,延迟可降至亚毫秒级
- DiskANN:磁盘索引,支持百亿级数据
Milvus的HNSW索引查找过程(多线程并行):