向量检索耗时:不同数量级下差多少

用计算模型 + 对照表讲清 1万→1亿 行下暴力与 ANN 的耗时、QPS、召回率差异,以及维度与内存两个隐藏瓶颈。

耗时从哪来:一次查询算几次

向量检索的单次查询耗时,核心来自"要和多少个候选向量做距离计算":

单查耗时 ≈ 候选数 × 向量维度 × 每次距离的计算量

假设维度 d=768,单次内积约 768 次乘加。下面给出不同数量级下的实测量级估计(CPU 单线程粗略、用于建立直觉,非精确 benchmark)。

不同数量级耗时对照(d=768,单查)

数据量 NFLAT 暴力扫描FLAT QPS(估)HNSW(ANN)HNSW QPS(估)HNSW 召回@10
1 万~1–3 ms~400~0.3 ms~300099%+
10 万~10–25 ms~60~0.4 ms~250099%+
100 万~80–200 ms~8~0.6–1.5 ms~800–150095–99%
1000 万~0.8–2 s~1~1–3 ms~400–80095–98%
1 亿~8–20 s ❌<1~3–8 ms*~150–400*90–97%*

* 1 亿级单机能扛的 HNSW 往往内存放不下,需 IVF-PQ / DiskANN / 分布式分片;标 * 为分片或压缩后的典型值。

单查耗时(ms, log) 2 15 140 1500 15000 0.4 1 3 1万 · 10万 · 100万 · 1000万 · 1亿 FLAT(暴力) HNSW(ANN)
图 1:暴力扫描耗时随数据量线性(指数感)飙升;ANN 几乎不随 N 增长。纵轴为对数示意。

维度的影响

耗时与维度 d 成正比。从 384 → 768 → 1536,单次距离计算量翻倍再翻倍:

维度 d相对计算量对 FLAT对 ANN
3841×快一半略快
7682×基准基准
15364×慢约 4 倍访问节点数略增,整体约 2–3×
高维还会带来"维度灾难":距离分布趋同,暴力意义下降,ANN 索引也更难建。能用 768 就别盲目上 1536,除非精度确实不够。

内存才是真正的瓶颈

耗时之外,内存往往先爆。float32 每维 4 字节:

内存 = N × d × 4 字节(未压缩,HNSW 还要额外存图边)
数据量768d float32PQ 压缩后(~1/32)
100 万~3 GB~0.1 GB
1000 万~30 GB~1 GB
1 亿~300 GB ❌~10 GB

HNSW 因为是图结构,还要额外存邻居边(约 N×M×4 字节,M 通常 16~64),实际内存比裸向量还大。所以亿级数据几乎必须用 IVF-PQ / 磁盘索引(DiskANN)/ 分布式。

工程经验数据(量级参考)

结论速记