用计算模型 + 对照表讲清 1万→1亿 行下暴力与 ANN 的耗时、QPS、召回率差异,以及维度与内存两个隐藏瓶颈。
向量检索的单次查询耗时,核心来自"要和多少个候选向量做距离计算":
假设维度 d=768,单次内积约 768 次乘加。下面给出不同数量级下的实测量级估计(CPU 单线程粗略、用于建立直觉,非精确 benchmark)。
| 数据量 N | FLAT 暴力扫描 | FLAT QPS(估) | HNSW(ANN) | HNSW QPS(估) | HNSW 召回@10 |
|---|---|---|---|---|---|
| 1 万 | ~1–3 ms | ~400 | ~0.3 ms | ~3000 | 99%+ |
| 10 万 | ~10–25 ms | ~60 | ~0.4 ms | ~2500 | 99%+ |
| 100 万 | ~80–200 ms | ~8 | ~0.6–1.5 ms | ~800–1500 | 95–99% |
| 1000 万 | ~0.8–2 s | ~1 | ~1–3 ms | ~400–800 | 95–98% |
| 1 亿 | ~8–20 s ❌ | <1 | ~3–8 ms* | ~150–400* | 90–97%* |
* 1 亿级单机能扛的 HNSW 往往内存放不下,需 IVF-PQ / DiskANN / 分布式分片;标 * 为分片或压缩后的典型值。
耗时与维度 d 成正比。从 384 → 768 → 1536,单次距离计算量翻倍再翻倍:
| 维度 d | 相对计算量 | 对 FLAT | 对 ANN |
|---|---|---|---|
| 384 | 1× | 快一半 | 略快 |
| 768 | 2× | 基准 | 基准 |
| 1536 | 4× | 慢约 4 倍 | 访问节点数略增,整体约 2–3× |
耗时之外,内存往往先爆。float32 每维 4 字节:
| 数据量 | 768d float32 | PQ 压缩后(~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)/ 分布式。