2分钟和6.7小时建完:六款数据库的向量检索分水岭在并发

Percona 实验室把 99 万条 1,536 维 OpenAI 官方 embedding 灌进六款”自己会建向量索引”的数据库(MariaDB 11.8 / MariaDB 12.3 / AliSQL / pgvector / Valkey / Percona Search for MongoDB),每台建 HNSW 索引,同机同容器规格测五件事:建库时间、存储占用、召回-吞吐曲线、并发吞吐、10% 语料重写后的衰减。同一台机器、同一跑法,全部数据开源在 github.com/Percona-Lab/vector-bench。

建库:最窄差 2 分钟,最宽 6.7 小时

指标 组内范围 细节
到可查询索引时间 **1.9 分钟 → 6.7 小时** 换 embedding 模型:pgvector 一下午,AliSQL 一个周末
索引体积 **3.9 GiB → 15.1 GiB** 索引最小的那台(MariaDB 11.8 / 12.3 / AliSQL 并列 3.9 GiB)反而建得最久——跑满 6.7 小时的是 AliSQL
灌数据速度 41 行/秒 → **69,018 行/秒** 逐行改图形的 MHNSW/VIDX 最慢(41-76 行/秒);批量入库的 Percona Search 最快,Valkey 30,170 行/秒居第二
表+索引合计 MariaDB 14.3 GiB / Percona Search **5.8 GiB** 同一批向量差 2.5 倍

并发:这张表最该细看

单客户端时大家差距不大,32 客户端时队形散了:pgvector 交回单客户端 21.7 倍 的吞吐,结论节给出的判据是 4,798 QPS、p99 10.8 ms,比 MySQL 家族高一个数量级。而三个 InnoDB 系引擎停在约 1 倍——吞吐不涨、中位延迟涨 20 倍(MariaDB 11.8 从 4.6ms 到 97ms,AliSQL 5.1ms 到 133ms),这就是服务端排队的形状。

并发扩展图:InnoDB系引擎吞吐持平、延迟飙升(图源:Percona 官方博客)

原文的诚实值得单独说:并发表里有 2 个被明确标记撤销 的数据点,另有 6 个(36 个格里)被 harness 拒绝换算——Python 线程共享解释器锁,MariaDB 连接器在 socket 等待时持锁,部分”客户端”其实在等锁而不是等数据库。作者按 Little’s law 复核”在服务中的查询数”后拒绝换算。但作者强调:撤销不影响结论,队列是服务端实打实的。

带过滤的检索:三家三种活法

引擎策略 10% 选择性 1% 选择性 表现
pgvector:过滤后停 — 召回 **0.1034**(默认配置) 只要 10 条时真返回一两条,不报错、全速跑
MariaDB/AliSQL:过滤后继续搜 召回 >0.97 吞吐 <1 QPS,p99 **10-13 秒** 准,但慢到不可用
Percona Search:先过滤再搜 **71.9 QPS** **117.5 QPS** 唯一越过滤越快的引擎
Valkey:逐查询规划 — 唯一”又准又能用”的 —

pgvector 的 0.1034 是默认配置的代价——0.8 版有 iterative scan 专门治这个,但本次没测。原文一句话很扎心:这个默认值就是”没人知道要改”时应用拿到的东西。

过滤检索图:Percona Search越收紧越快(图源:Percona 官方博客)

语料重写 10% 之后

删除 99,000 行再原样插回,重新测索引:往已建成的图里重写,成本是初次建库的 2-3 倍(重插 16-28 行/秒 vs 首灌 41-76)。Percona Search 吞吐掉了 39.2%(全场最大跌幅,召回几乎不动);pgvector 持平,因为跑了 VACUUM ANALYZE——它是全场唯一提供维护钩子的引擎。

重写吞吐图(图源:Percona 官方博客)

原文的选择建议(附边界)

并发流量选 pgvector(记得先开 iterative scan);工作集放得进内存且过滤要又快又准选 Valkey(官方建议先测其索引写入路径);索引要小、流量不大选 MariaDB 12.3(召回 0.99 全场最快 277 QPS);过滤是常态且能接受技术预览版选 Percona Search。边界:单机、单语料、单跑次,最可能变动的是三个缺失的重写数据和六个被撤销的并发点。

小夏点评

  • 这场测试真正的信号是”引擎家族分层”:三个 InnoDB 系引擎在并发下集体排队,存储引擎可能才是那个隐藏变量——选向量方案前先压并发,比看单线程 QPS 有意义。
  • “默认配置即产品”值得每个 DBA 抄进巡检清单:pgvector 过滤召回 0.1034 不是 bug,是没人改默认值的常态。
  • 对国内把 pgvector/Valkey 当向量底座的公司,这份数据给了两条硬提醒:上线前把过滤查询的召回率单独验一遍;数据要频繁重写的场景,把”重写后的索引性能”写进选型标准,别只测冷库。
  • 参考来源

  • Percona Blog: Benchmarking Vector search in six database engines(2026-10-29)
  • Benchmarking Vector search in six database engines

  • 测试框架与原始数据:github.com/Percona-Lab/vector-bench
  • 您可能还喜欢...

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注