向量数据库 2025 大测评——Milvus、Qdrant、pgvector、Weaviate
向量数据库 2025 大测评——Milvus、Qdrant、pgvector、Weaviate
适读人群:要选型向量数据库的工程师 | 阅读时长:约 14 分钟 | 核心价值:真实测评数据 + 明确选型建议,不是官方 benchmark
去年底我在做一个企业知识库项目,数据量大概是 500 万条文档向量,维度 1536(OpenAI embedding)。在这之前,我在几个不同规模的项目里用过 pgvector 和 Milvus。这次想系统地比一比,于是就有了这篇文章。
说明一下测试环境:AWS EC2 c5.2xlarge(8 vCPU,16G RAM),这是我觉得大多数中型项目合理的配置。数据集是 500 万条维度 1536 的向量,来自真实的企业文档 embedding。以下所有数据都是我自己跑的,不是厂商提供的 benchmark。
四款数据库的基本情况
先说背景,避免用了两年 Milvus 的人和刚装了 pgvector 的人对这几个选手有不同的预期。
Milvus:专为向量搜索设计的分布式数据库,架构复杂(依赖 etcd + MinIO),但功能最全。2.x 版本之后有了 Milvus Lite,小规模场景可以单机部署。
Qdrant:Rust 写的,性能很好,近两年发展很快。API 设计比 Milvus 更直观,单机部署简单。
pgvector:PostgreSQL 扩展,如果你本来就用 PostgreSQL,几乎零额外成本。功能相对基础,但对大多数场景够用。
Weaviate:Go 写的,有内置的模块化设计,可以直接对接多种 embedding 模型。但资源消耗偏高。
性能测试
写入性能(500 万条,批量写入)
我用批量写入,每批 1000 条,测试总时间:
Milvus: 约 28 分钟(含索引构建)
Qdrant: 约 22 分钟(含索引构建)
pgvector: 约 45 分钟(pg_ivfflat 索引,需要先写完再建索引)
Weaviate: 约 35 分钟(含向量索引)pgvector 的写入慢主要是因为 IVFFlat 索引需要在数据写完后单独构建,构建时间随数据量线性增长。HNSW 索引支持实时更新,但 PostgreSQL 的并发写入能力本身就不如专用向量数据库。
写入代码示例(以 Qdrant 为例,接口最友好):
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
import numpy as np
from typing import List
client = QdrantClient(host="localhost", port=6333)
# 建集合
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)
def batch_upsert(vectors: List[np.ndarray], payloads: List[dict], batch_size: int = 1000):
"""批量写入,带进度跟踪"""
total = len(vectors)
for i in range(0, total, batch_size):
batch_vectors = vectors[i:i+batch_size]
batch_payloads = payloads[i:i+batch_size]
points = [
PointStruct(
id=i + j,
vector=vec.tolist(),
payload=payload
)
for j, (vec, payload) in enumerate(zip(batch_vectors, batch_payloads))
]
client.upsert(collection_name="documents", points=points)
if (i // batch_size) % 10 == 0:
print(f"Progress: {min(i+batch_size, total)}/{total}")查询性能(单条查询,top-10 召回)
测试 1000 次查询,取 P50/P95/P99 延迟:
P50 P95 P99
Milvus: 12ms 28ms 45ms
Qdrant: 9ms 21ms 38ms
pgvector: 85ms 180ms 320ms
Weaviate: 18ms 42ms 78mspgvector 的差距很明显。这不是 pgvector 的 Bug,是 PostgreSQL 的 MVCC 架构和向量索引实现的天然代价。在数据量小(<100 万条)时差距会缩小很多,但到 500 万条这个量级,差距已经不可忽视。
Qdrant 的查询性能在四款里最好,Rust 实现的内存效率确实有体现。
# Qdrant 查询示例
import time
from qdrant_client.models import Filter, FieldCondition, MatchValue
def search_with_filter(query_vector: List[float], category: str, top_k: int = 10):
"""带过滤条件的向量搜索"""
start = time.time()
results = client.search(
collection_name="documents",
query_vector=query_vector,
query_filter=Filter(
must=[
FieldCondition(
key="category",
match=MatchValue(value=category)
)
]
),
limit=top_k,
with_payload=True
)
latency_ms = (time.time() - start) * 1000
return results, latency_ms
# pgvector 等效查询(对比用)
# SELECT id, content, 1 - (embedding <=> $1) AS similarity
# FROM documents
# WHERE category = $2
# ORDER BY embedding <=> $1
# LIMIT 10;召回率(在 ground truth 数据集上测试 recall@10)
这个指标取决于索引配置,我用各家推荐的默认配置:
Milvus (IVF_FLAT, nlist=1024): recall@10 = 0.973
Qdrant (HNSW, m=16, ef=128): recall@10 = 0.981
pgvector (HNSW, m=16, ef=64): recall@10 = 0.968
Weaviate (HNSW 默认): recall@10 = 0.975召回率差距不大,调参后都能接近 0.99。这方面不是主要的选型依据。
易用性对比
这块是我认为最能体现真实工程体验的部分,纯数字体现不出来。
部署复杂度
pgvector:如果已经有 PostgreSQL,一行命令搞定:
CREATE EXTENSION vector;零额外基础设施,DBA 不需要学新东西,运维成本最低。
Qdrant:Docker 单容器,文档清晰:
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
qdrant/qdrant5 分钟能跑起来。
Milvus:生产部署需要 etcd + MinIO + 多个 Milvus 组件。官方提供 Helm chart,但出了问题排查起来很痛苦。Milvus Lite 可以单机用,但有功能限制。
Weaviate:Docker 可以单节点,但内存消耗比较高(我测的 500 万条大概吃了 12G RAM),小机器跑不起来。
API 设计
Qdrant 的 API 我认为设计得最好,语义清晰,错误信息明确。
Milvus 的 Python SDK 文档质量良莠不齐,有些接口行为和文档描述不符,踩过几次坑。
pgvector 就是 SQL,没有学习成本——如果你会 PostgreSQL。
Weaviate 的 GraphQL 接口让很多人不适应,v4 的 Python 客户端改成了更普通的 OOP 风格,好多了。
监控和运维
pgvector: 用 PostgreSQL 原有的监控体系,pg_stat_statements 等工具直接用
Qdrant: 有内置的 /metrics 接口(Prometheus 格式),监控接入很方便
Milvus: 有专用的 Attu 管理 UI,但监控系统比较重
Weaviate: 有 /v1/meta 和 Prometheus 接口,中规中矩成本估算
以 500 万条 1536 维向量,AWS 上部署为例(月费用估算):
pgvector (RDS PostgreSQL r6g.large): ~$120/月
Qdrant (EC2 c5.2xlarge 自建): ~$150/月(计算) + ~$30(存储)
Milvus (EKS 集群,最小配置): ~$300/月(etcd+MinIO+节点)
Weaviate (EC2 r5.large 自建): ~$180/月Milvus 的生产集群成本明显高于其他选项,如果数据量不到千万级,这个成本不太划算。
明确的选型建议
我不喜欢"视具体情况而定"这种废话,给明确建议:
用 pgvector,如果:
- 你已经在用 PostgreSQL,不想引入新的基础设施
- 数据量 < 200 万条
- 对查询延迟不敏感(>100ms 可以接受)
- 团队没有专门的 AI 基础设施工程师
用 Qdrant,如果:
- 数据量在 100 万到 5000 万条之间
- 对查询性能有要求(<20ms P95)
- 团队有一定 DevOps 能力
- 这是我目前默认推荐的选择
用 Milvus,如果:
- 数据量超过 5000 万条,需要水平扩展
- 有 Kubernetes 运维能力
- 需要多租户隔离
Weaviate 我现在不推荐,除非你强依赖它的模块化生态(比如内置的 OpenAI/Cohere 集成)。性能和资源消耗的比例不如 Qdrant,文档质量比较混乱。
一句话总结:中小型项目,能用 pgvector 的用 pgvector,规模再大点 Qdrant 是目前工程综合体验最好的选择。Milvus 是大规模生产的选项,但请确保你有能力运维它。
