3、选型第一关:数据规模与性能:百万级、千万级、亿级向量场景下的吞吐量与延迟对比,我踩过的性能坑。

很多朋友选向量数据库,上来就问:“哪个最快?”

说实话,这个问题没法直接回答。你想想看,百万级和亿级数据量,对系统的要求完全是两码事。我见过不少团队,拿着小规模测试的数据去推演生产环境,结果上线就崩。

今天咱们就聊聊,不同数据规模下,吞吐量和延迟到底怎么变。顺便说说我踩过的那些坑。

3.1 数据规模的三道坎

我个人习惯把向量数据规模分成三个档位:

规模等级 向量数量 典型场景
百万级 10万 ~ 500万 小型推荐、图片去重、小规模语义搜索
千万级 500万 ~ 5000万 中型搜索、用户画像匹配、风控
亿级 5000万 ~ 10亿+ 大规模搜索引擎、全量商品推荐、社交网络

每个档位,选型策略完全不同。别想着一个方案打天下,那会出大问题。

3.2 吞吐量与延迟:鱼和熊掌

吞吐量(QPS)和延迟(Latency),本质上是矛盾的。你追求高并发,单个请求的处理时间就会变长。反过来,你想让每个请求都快,并发能力就得降下来。

我举个例子。同样是 1000 万条 128 维向量,用 HNSW 索引:

  • 追求低延迟:把 ef_search 设小,比如 64。单次查询延迟能压到 5ms 以内,但 QPS 可能只有 200。
  • 追求高吞吐:把 ef_search 设大,比如 256。QPS 能冲到 2000,但延迟会涨到 20ms 以上。

你看,这就是个 trade-off。没有的好,只有适合不适合。

核心原则:先定延迟目标,再压吞吐量。别反过来。

3.3 百万级场景:别想太多

百万级数据量,说实话,大部分向量数据库都能搞定。我建议你关注两点:

  1. 索引构建速度:别等几个小时索引还没建好。
  2. 资源占用:别为了 100 万向量,配个 64G 内存的机器。

我在项目中遇到过,有人用 FAISS 搭了个 200 万向量的服务,结果每次重启都要重新建索引,耗时 40 分钟。后来换成支持持久化的 Milvus,问题就解决了。

小技巧:百万级场景,优先考虑易用性和运维成本。性能差异不大,别在这上面纠结。

3.4 千万级场景:开始有挑战了

到了千万级,事情就复杂了。你会发现,同样的查询,延迟开始不稳定。有时候 10ms,有时候 100ms。

为什么会这样?

因为索引结构开始受到内存和磁盘 I/O 的影响。HNSW 这种图索引,在千万级下,内存占用会变得很大。我算过一笔账:

  • 1000 万条 768 维向量(比如 BERT 生成的),原始数据占 30GB。
  • 加上 HNSW 的图结构,内存占用轻松超过 60GB。

这时候,如果你用单机方案,内存很容易爆。我踩过这个坑。当时选了个单机版 Milvus,数据量涨到 2000 万,服务直接 OOM 了。后来不得不迁移到分布式方案,折腾了两周。

避坑指南:千万级场景,一定要提前评估内存和磁盘的配比。我曾经因为没算好,导致线上服务频繁重启。建议预留 1.5 倍的内存余量。

3.5 亿级场景:真正的考验

亿级向量,说实话,能选的方案就不多了。你需要考虑:

  • 分布式分片:数据必须打散到多台机器上。
  • 索引分区:单个索引文件不能太大,否则查询效率急剧下降。
  • 资源隔离:写入和查询要分开,别互相影响。

我参与过一个项目,10 亿条 128 维向量,要求 P99 延迟在 50ms 以内。我们试了好几种方案:

方案 QPS P99 延迟 机器数
单机 HNSW 500 120ms 1 台 128G
分布式 IVFPQ 3000 45ms 4 台 64G
分布式 HNSW 2000 30ms 8 台 64G

最终我们选了分布式 IVFPQ。虽然召回率比 HNSW 低一点,但性价比高,延迟也达标。

经验之谈:亿级场景,别追求 100% 召回。99% 的召回率,配合业务层的二次过滤,效果完全够用。

3.6 我踩过的性能坑

这些年,我在性能上栽过不少跟头。挑几个典型的说说:

  • 坑一:索引参数没调。默认参数跑小数据没问题,数据一涨,性能直接崩。HNSW 的 M 和 efConstruction,IVF 的 nlist,这些参数必须根据数据量调。
  • 坑二:忽略了预热。有些索引需要预热才能达到最佳性能。我试过,没预热的时候 P99 延迟 200ms,预热后降到 20ms。
  • 坑三:并发模型选错。Python 的 GIL 是个大问题。用多线程做向量查询,性能还不如单线程。后来改成多进程 + 异步,才把吞吐量提上去。

避坑指南:我曾经在生产环境直接用了默认参数,结果线上延迟飙升。建议上线前,先用 10% 的数据做参数调优,找到最优配置。

3.7 一张图看懂选型逻辑

下面这张图,是我自己总结的选型决策流程。每次做新项目,我都会拿出来对照一下。

向量数据库选型决策流程 确定数据规模 百万级 千万级 亿级 单机方案即可 评估内存/磁盘 必须分布式 确定索引类型与参数 说明:数据规模决定架构选型,架构选型决定索引策略,索引策略决定最终性能

3.8 总结一下

选型第一关,说白了就是搞清楚你的数据规模。别拿百万级的经验去套亿级场景,也别为了亿级场景过度设计百万级的方案。

我个人的建议是:

  • 百万级:随便选,关注运维成本。
  • 千万级:认真评估内存和磁盘,做好参数调优。
  • 亿级:分布式是必须的,做好分片和资源隔离。

嗯,今天就聊到这儿。记住,性能不是选出来的,是测出来的。拿到数据,先跑个 benchmark,比什么都强。