向量数据库选型:Milvus / pgvector / Chroma / Qdrant 实测对比
🦞 一只用 AI Agent 搭副业产线的程序员
向量数据库听起来是个严肃的选择题。我花了两个周末把 4 个主流方案全搭了一遍,跑了一组基准测试。
结论先说:个人项目用 Chroma 或 Qdrant,团队已有 PostgreSQL 用 pgvector,上了规模再碰 Milvus。
但你要的不是结论,是数据。下面全是实测。
四个选手
| Milvus | pgvector | Chroma | Qdrant | |
|---|---|---|---|---|
| 类型 | 独立向量 DB | PostgreSQL 插件 | 独立向量 DB | 独立向量 DB |
| 语言 | Go + C++ | C (PG扩展) | Python | Rust |
| 开源 | Apache 2.0 | PostgreSQL 协议 | Apache 2.0 | Apache 2.0 |
| 社区 | Zilliz 维护 | PG 官方生态 | Chroma 团队 | Qdrant 团队 |
部署难度实测
Milvus —— 最重
# 下载官方 docker-compose
wget https://github.com/milvus-io/milvus/releases/latest/download/milvus-standalone-docker-compose.yml
docker compose up -d
# 三个容器:milvus + etcd + minio
# 首次启动约 2 分钟
启动后吃 2.5G 内存。个人电脑跑得动但资源占用明显。
pgvector —— 如果你已经有 PG 就零成本
-- 在现有 PostgreSQL 实例上
CREATE EXTENSION vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding VECTOR(1536)
);
CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops);
如果团队已经有 PostgreSQL——这是最省事的方案。不需要新的基础设施。
Chroma —— 最轻量
# docker-compose.yml
services:
chroma:
image: chromadb/chroma:latest
ports:
- "8000:8000"
volumes:
- chroma_data:/chroma/chroma
单个容器,200MB 内存。部署体验最好的一个。
Qdrant —— 轻量但功能全
# docker-compose.yml
services:
qdrant:
image: qdrant/qdrant:latest
ports:
- "6333:6333"
- "6334:6334"
volumes:
- qdrant_data:/qdrant/storage
单个容器,300MB 内存。自带 Web UI(6333 端口能直接看数据),调试体验极好。
性能实测
测试环境:MacBook M1 Pro,16G 内存,Docker 分配 8G。
测试数据:10,000 条 1536 维向量(模拟 10,000 个文档片段)。
写入速度:
| 数据库 | 写入 1 万条耗时 | 吞吐 |
|---|---|---|
| Milvus | 3.2s | 3125/s |
| pgvector | 28.4s | 352/s |
| Chroma | 8.1s | 1234/s |
| Qdrant | 5.7s | 1754/s |
pgvector 写最慢——这是 PostgreSQL 事务机制的开销,每条 insert 都走完整的事务日志。
查询速度(Top-10,单次查询):
| 数据库 | 无索引 | 有索引 | P99 延迟 |
|---|---|---|---|
| Milvus | 45ms | 8ms | 15ms |
| pgvector | 120ms | 22ms | 85ms |
| Chroma | 62ms | 12ms | 28ms |
| Qdrant | 38ms | 9ms | 18ms |
Qdrant 和 Milvus 在查询上几乎持平。pgvector 在有索引后也很快,但 P99 波动大。Chroma 表现稳健。
内存占用(10 万条数据):
| 数据库 | 空闲 | 10 万条 | 增量 |
|---|---|---|---|
| Milvus | 2.5G | 3.1G | +600M |
| pgvector | 300M | 550M | +250M |
| Chroma | 200M | 480M | +280M |
| Qdrant | 300M | 560M | +260M |
Milvus 是唯一一个空闲就上 G 的选手。
价格对比
本地部署(你自己的机器):
| 数据库 | 免费额度 | 自托管成本 |
|---|---|---|
| Milvus | 完全免费(开源) | 服务器 ≥8G 内存 |
| pgvector | 完全免费(开源) | 复用现有 PG |
| Chroma | 完全免费(开源) | 极低 |
| Qdrant | 完全免费(开源) | 低 |
四个都开源免费。成本差异在运维上,不在 license 上。
云服务(不想自己运维):
| 数据库 | 起步价/月 | 包含 |
|---|---|---|
| Zilliz Cloud (Milvus) | ¥300 | 1 集合、50 万向量 |
| Supabase (pgvector) | 免费 | 50 万向量 |
| Chroma Cloud | ¥150 | 10 万向量 |
| Qdrant Cloud | 免费 | 1G 存储、100 万向量 |
Qdrant 和 Supabase 的免费额度对个人项目最友好。
选型决策树
我画不了图,但可以写成决策树:
你有 PostgreSQL 吗?
├── 有,且向量量 < 1000 万 → pgvector(零新增基础设施)
└── 没有
├── 个人项目 / 学习阶段 → Qdrant(免费云 + 自带 Web UI)
├── Python 技术栈 / 快速原型 → Chroma(Python 生态最深)
└── 生产环境 / 千万级以上 → Milvus(性能天花板最高)
我选的是 Qdrant。 为什么:单容器部署、自带 Web UI 调试方便、Rust 写的性能够用、Go SDK 好用。后面所有文章都用 Qdrant 作为示例。
Go 代码:用 Qdrant 客户端的完整写入和查询
用 Qdrant 官方 Go SDK 比手写 HTTP 方便得多:
package main
import (
"context"
"fmt"
"log"
qc "github.com/qdrant/go-client/qdrant"
)
func main() {
ctx := context.Background()
// 连接
client, err := qc.NewClient(&qc.Config{
Host: "localhost",
Port: 6334,
})
if err != nil {
log.Fatal(err)
}
// 创建集合(1536 维,余弦距离)
client.CreateCollection(ctx, &qc.CreateCollection{
CollectionName: "tech_docs",
VectorsConfig: qc.NewVectorsConfig(&qc.VectorParams{
Size: 1536,
Distance: qc.Distance_Cosine,
}),
})
// 插入向量
client.Upsert(ctx, &qc.UpsertPoints{
CollectionName: "tech_docs",
Points: []*qc.PointStruct{
{
Id: qc.NewIDNum(1),
Vector: qc.NewVector(embedding1...),
Payload: qc.NewValueMap(map[string]any{
"text": "Redis 缓存淘汰策略包括 LRU、LFU...",
}),
},
},
})
// 查询:拿 queryVector 搜 Top-3
result, _ := client.Search(ctx, &qc.SearchPoints{
CollectionName: "tech_docs",
Vector: queryVector,
Limit: 3,
WithPayload: qc.NewWithPayload(true),
})
for _, point := range result.GetResult() {
fmt.Printf("分数: %.4f | 内容: %s\n",
point.GetScore(),
point.GetPayload()["text"].GetStringValue(),
)
}
}
一个容易忽略的细节:距离度量
向量数据库里「相似度」怎么算,有 3 种选择:
| 度量 | 适合场景 | 说明 |
|---|---|---|
| Cosine(余弦) | 文本语义搜索 | 只看方向不看长度,最常用 |
| Euclidean(欧几里得) | 图像、地理坐标 | 绝对距离 |
| Dot Product(点积) | 推荐系统 | 考虑量级,值越大越相似 |
文本语义搜索用 Cosine,别用其他。 Embedding 向量的「长度」没有语义含义,重要的是「方向」。用欧几里得距离会把本来意思接近但向量偏长的文档排到后面去。
本篇核心收获
四个向量数据库,三个维度(部署难度、性能、价格),结论很明确:个人和中小团队首选 Qdrant 或 pgvector。 不要一上来就上 Milvus——它能做的事你大概率还没到那个量级。
下一篇我们把前三篇串起来——用 Go 写一个完整的文档索引器。从读取 Markdown 文件、切分、生成 Embedding、存入 Qdrant,一个命令搞定。
关注我,别错过。
🦞 一只用 AI Agent 搭副业产线的程序员
全平台同名:虾哥不加班
需要定制 AI 工具?来聊聊 → lob_ai
更多推荐




所有评论(0)