Measurements / 2026-10

数字,以及它们的边界。

这里只放 HouyiDB 自己的单机实测:1×/2× 连接密度、过滤连续向量缓存、streaming plan/apply。没有跨场景总分,也没有外部系统数据。

先读方法,再读数字。

所有数字来自同一类机器与流程:每个数据集加载一次,随后用 --skip-load 扫描 ef_search;每次加载前清空数据目录并重启数据库。不同表格来自不同日期或代码路径,只能在同一场景内做 A/B,不能拼成一个总分。

柱状图按同一图内的最大值归一,只服务于该图内的相对比较;精确数值标注在条末或数值表中。

机器
Apple Silicon (arm64)
8 核 · 16GB · macOS · AC
版本
v0.2.0-beta.5
candidate builds
共同参数
k=10 · m=24
ef_construction=400 · COSINE
并发
1 / 8 / 16 · 每档 30s
load_concurrency=8
两种 level-0 连接密度。 2×M 是当前默认:召回优先,兼容已有 2× 图快照。1×M 是高频 QPS 档:召回略低(Cohere 场景约 0.9pp)。两种模式不能在同一份旧图快照上直接切换;切换前确认快照 / WAL 完整,或接受一次全量重放。

构图使用 PARALLEL_BATCH_BUILD=1、MAX_BUILD_BATCH=8192、SEED_SERIAL_POINTS=256。完整参数、公平性原则与结果记录模板见 VDBBENCH_PROTOCOL.md ↗。

1× vs 2×:速度与召回的交换。

默认 2× 优先召回与旧快照兼容;1× 把 level-0 连接数减半,换取更高 QPS。以下两组数据只做同场景内的 A/B。

FIG. 01

OpenAI 1536D / 50K — QPS

同一数据集、同一天的构建;ef64 给出 conc 8 / 16 两档,ef128 / ef256 为该场景记录的 QPS。两条柱分别为 2×M 与 1×M。

2×M(默认) 1×M(高 QPS)

同场景补充:ef64 recall 均为 0.9999;ef64 p99 9.6ms → 6.0ms;加载 81.2s(insert 42.6 + optimize 38.6)→ 57.2s(38.9 + 18.3)。

展开数值表 / Data
OpenAI 1536D / 50K,2026-10-22
指标2×1×
ef64 QPS · c8426.1686.0
ef64 QPS · c16400.3680.3
ef128 QPS403.9663.5
ef256 QPS411.8652.6
ef64 recall0.99990.9999
ef64 p999.6ms6.0ms
加载总耗时81.2s57.2s
FIG. 02

Cohere 768D / 1M — QPS 与召回

同场景 1M 数据集;2× 来自 2026-10-21,1× 来自 2026-10-22。ef128 / ef256 各给 conc 8 / 16 两档。

2×M(默认) 1×M(高 QPS)

代价:ef128 / ef256 recall 为 0.9971(2×)对 0.9883(1×),差约 0.9pp;加载 1653.7s(1465.1 + 188.6)→ 1012s(825 + 187)。

展开数值表 / Data
Cohere 768D / 1M,2026-10-21 与 10-22
指标2×1×
ef128 QPS · c8610894
ef128 QPS · c16614864
ef256 QPS · c8608833
ef256 QPS · c16627839
ef128 / ef256 recall0.99710.9883
加载总耗时1653.7s1012s
结论只在同一数据集内成立。 OpenAI 50K 上,1× 的 QPS 提升约 58–64%,召回不变;Cohere 1M 上,1× 的 QPS 更高,但召回低约 0.9pp。默认仍保持 2×;召回敏感场景用 2×,高 QPS 场景显式设 1×。

过滤缓存:把随机访问变成顺序 SIMD。

在 Cohere 1M、1% labels 的过滤场景里,命中量大时 HouyiDB 会按标签惰性构建连续向量缓存(Cosine 预先单位化),查询退化为顺序 SIMD 扫描 + top-k。两种路径的 recall 均保持 1.0000。

FIG. 03

Label filter — Cohere 1M(1% labels)

旧路径为 2×(2026-10-22);新路径为 1× + 连续向量缓存(2026-10-23 复测)。

旧路径(2×) 1× + 连续向量缓存

运行方差:首次实测曾达 ef128 1361/1365、ef256 1321/1386 QPS;10-23 复测受后台负载影响为 1161.9/1176.4(conc 8)。两次都高于同一实现的旧路径。写入后缓存按批失效重建;超过 256MB 的标签回退旧路径。

展开数值表 / Data
Label filter,Cohere 1M,1% labels
指标旧路径 2×1× + 缓存
ef128 QPS · c86971161.9
ef128 QPS · c16698907.3
ef256 QPS · c86881176.4
ef256 QPS · c16747784.2
ef128 / ef256 recall1.00001.0000
加载总耗时1624.1s1301.6s

Streaming:把 104 秒压到 3.9 秒。

合图默认「读锁规划 + 短写锁提交」:规划在 HNSW 读锁内并行完成,提交只持短写锁(实测 3–7ms/批),构图期间检索可并发读图。场景为 Cohere 100K、insert_rate=500/s、k=100。

FIG. 04

Streaming 检查点到达时间

50% / 80% / 100% / 110% 检查点的实际到达时间(秒);实际写入三者均为 200.1s。柱越短,检查点越早到达。

旧路径 1×(10-22) 新 1×(10-23) 新 2×(10-23)

同场景补充:optimize 0.07s → 0.01s;成熟 recall(100% / 110%):旧路径 .988 / .988;新 1× .9876 / .9876;新 2× .996 / .996。100% QPS(c10):1221 → 1355(新 1×)/ 887(新 2×)。

展开数值表 / Data
Streaming,Cohere 100K,insert_rate=500/s,k=100
指标旧 1×新 1×新 2×
检查点 50%100.8s101.0s101.0s
检查点 80%206.3s164.4s165.3s
检查点 100%211.2s201.0s201.0s
检查点 110%294.0s282.5s284.5s
成熟 recall 100% / 110%.988 / .988.9876 / .9876.996 / .996
100% QPS · c1012211355887
110% QPS · c1011751353894
optimize0.07s0.01s0.01s
FIG. 05

50% 阶段 — 1000 条串行查询总耗时

以旧路径总耗时 104s 为 100%。条末数字为「总耗时 / p99」。

旧路径 1× 新 1× 新 2×

换算:新路径总耗时约为旧路径的 1/17 – 1/27,p99 约为 1/69 – 1/82。柱子按线性比例绘制,新路径的实际长度很小,数值以标签为准。

早期 recall 不能跨搜索速度直接比较。 VectorDBBench 的 streaming ground truth 是全集静态的,而写入是数据集行序前缀。CohereSmall 实测 GT@10 可达上限:前 50% 行 0.5030、前 80% 行 0.8031。旧路径 50% recall .954 是因为查询被构图写锁阻塞(1000 条查询耗时 104s),多数查询实际在库接近建完后才执行;新路径 3.9s 跑完,量到的是覆盖率上限(.515 / .826)。成熟 recall 看 100% / 110%。

新路径的代价是批量建库总墙钟约 +11%(Cohere 1M:1170s vs 1055s);对加载时间极敏感的场景可设 HOUYI_HNSW_PLAN_APPLY=0 回退旧路径。最终 gate 版本 2026-10-24 复测:检查点 100.95 / 164.69 / 200.90 / 283.25s,recall .5148 / .8307 / .988 / .988,串行 p99 22 / 24.9 / 4.9 / 4.7ms,100/110% QPS 999/1160、980/1214,与上表在运行方差内一致。

复现,以及不要做的事。

完整 case、参数与结果记录模板见 VDBBENCH_PROTOCOL.md ↗。下面是 HouyiDB 侧自测门禁的最短路径。

Terminal / reproduce bash
export VDB_ROOT=/path/to/VectorDBBench
python3 benchmarks/vectordb_bench_houyidb/install.py --vdb-root "$VDB_ROOT"

# 启动 houyi-server 后运行
VDB_ROOT="$VDB_ROOT" ./benchmarks/vectordb_bench_houyidb/run_bench.sh

# 1× / 旧合图路径:在启动服务前设置
# HOUYI_HNSW_LAYER0_MULT=1 / HOUYI_HNSW_PLAN_APPLY=0
注意:benchmark 会写入/重建测试 collection,请使用独立的空 WAL 与数据目录,不要指向生产数据。完整流程以协议文档为准。
  • 不拼总分不同表格来自不同日期或代码路径;每张表只做自身的 A/B。
  • 不混口径跨机器、模式(1×/2×)、ef_search、并发或接口路径的数字不能直接比较。
  • 不切旧图不要在旧图快照上直接切换 1×/2×;先确认快照 / WAL 完整或接受全量重放。
  • 不是基准以上是单机、单次运行的本机工程测量,不代表任何实验室或外部环境的结果。

数据源:docs/benchmarks/houyidb-performance-2026-10.md ↗。参数与调优旋钮另见 服务端手册 ↗。