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
构图使用 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。
OpenAI 1536D / 50K — QPS
同一数据集、同一天的构建;ef64 给出 conc 8 / 16 两档,ef128 / ef256 为该场景记录的 QPS。两条柱分别为 2×M 与 1×M。
同场景补充: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
| 指标 | 2× | 1× |
|---|---|---|
| ef64 QPS · c8 | 426.1 | 686.0 |
| ef64 QPS · c16 | 400.3 | 680.3 |
| ef128 QPS | 403.9 | 663.5 |
| ef256 QPS | 411.8 | 652.6 |
| ef64 recall | 0.9999 | 0.9999 |
| ef64 p99 | 9.6ms | 6.0ms |
| 加载总耗时 | 81.2s | 57.2s |
Cohere 768D / 1M — QPS 与召回
同场景 1M 数据集;2× 来自 2026-10-21,1× 来自 2026-10-22。ef128 / ef256 各给 conc 8 / 16 两档。
代价:ef128 / ef256 recall 为 0.9971(2×)对 0.9883(1×),差约 0.9pp;加载 1653.7s(1465.1 + 188.6)→ 1012s(825 + 187)。
展开数值表 / Data
| 指标 | 2× | 1× |
|---|---|---|
| ef128 QPS · c8 | 610 | 894 |
| ef128 QPS · c16 | 614 | 864 |
| ef256 QPS · c8 | 608 | 833 |
| ef256 QPS · c16 | 627 | 839 |
| ef128 / ef256 recall | 0.9971 | 0.9883 |
| 加载总耗时 | 1653.7s | 1012s |
过滤缓存:把随机访问变成顺序 SIMD。
在 Cohere 1M、1% labels 的过滤场景里,命中量大时 HouyiDB 会按标签惰性构建连续向量缓存(Cosine 预先单位化),查询退化为顺序 SIMD 扫描 + top-k。两种路径的 recall 均保持 1.0000。
Label filter — Cohere 1M(1% labels)
旧路径为 2×(2026-10-22);新路径为 1× + 连续向量缓存(2026-10-23 复测)。
运行方差:首次实测曾达 ef128 1361/1365、ef256 1321/1386 QPS;10-23 复测受后台负载影响为 1161.9/1176.4(conc 8)。两次都高于同一实现的旧路径。写入后缓存按批失效重建;超过 256MB 的标签回退旧路径。
展开数值表 / Data
| 指标 | 旧路径 2× | 1× + 缓存 |
|---|---|---|
| ef128 QPS · c8 | 697 | 1161.9 |
| ef128 QPS · c16 | 698 | 907.3 |
| ef256 QPS · c8 | 688 | 1176.4 |
| ef256 QPS · c16 | 747 | 784.2 |
| ef128 / ef256 recall | 1.0000 | 1.0000 |
| 加载总耗时 | 1624.1s | 1301.6s |
Streaming:把 104 秒压到 3.9 秒。
合图默认「读锁规划 + 短写锁提交」:规划在 HNSW 读锁内并行完成,提交只持短写锁(实测 3–7ms/批),构图期间检索可并发读图。场景为 Cohere 100K、insert_rate=500/s、k=100。
Streaming 检查点到达时间
50% / 80% / 100% / 110% 检查点的实际到达时间(秒);实际写入三者均为 200.1s。柱越短,检查点越早到达。
同场景补充: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
| 指标 | 旧 1× | 新 1× | 新 2× |
|---|---|---|---|
| 检查点 50% | 100.8s | 101.0s | 101.0s |
| 检查点 80% | 206.3s | 164.4s | 165.3s |
| 检查点 100% | 211.2s | 201.0s | 201.0s |
| 检查点 110% | 294.0s | 282.5s | 284.5s |
| 成熟 recall 100% / 110% | .988 / .988 | .9876 / .9876 | .996 / .996 |
| 100% QPS · c10 | 1221 | 1355 | 887 |
| 110% QPS · c10 | 1175 | 1353 | 894 |
| optimize | 0.07s | 0.01s | 0.01s |
50% 阶段 — 1000 条串行查询总耗时
以旧路径总耗时 104s 为 100%。条末数字为「总耗时 / p99」。
换算:新路径总耗时约为旧路径的 1/17 – 1/27,p99 约为 1/69 – 1/82。柱子按线性比例绘制,新路径的实际长度很小,数值以标签为准。
新路径的代价是批量建库总墙钟约 +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 侧自测门禁的最短路径。
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
- 不拼总分不同表格来自不同日期或代码路径;每张表只做自身的 A/B。
- 不混口径跨机器、模式(1×/2×)、ef_search、并发或接口路径的数字不能直接比较。
- 不切旧图不要在旧图快照上直接切换 1×/2×;先确认快照 / WAL 完整或接受全量重放。
- 不是基准以上是单机、单次运行的本机工程测量,不代表任何实验室或外部环境的结果。
数据源:docs/benchmarks/houyidb-performance-2026-10.md ↗。参数与调优旋钮另见 服务端手册 ↗。