pgvector 0.6.0:并行索引构建速度提高 30 倍

2025-06-10

pgvector 0.6.0:并行索引构建速度提高 30 倍

pgvector 0.6.0 今日发布,带来一项重大改进:支持并行构建 HNSW 索引。对于未记录日志的表,构建 HNSW 索引的速度现在提升了 30 倍。

此版本对于 pgvector 来说是一个巨大的进步,使得调整 HNSW 构建参数和提高搜索准确性和性能变得更加容易。

pgvector 中的 HNSW 索引

我们在之前的一篇文章中探讨了HNSW 的工作原理,现在简单回顾一下:HNSW 是一种近似最近邻搜索算法。它使用邻近图,由两部分组成:分层结构和可导航的小世界网络。它在多个节点密度或节点间距离不同的层上运行,其中层代表节点之间不同的连接长度。因此,HNSW 可以在线性对数时间内完成搜索、插入和删除操作。

pgvector 并行索引构建

在 0.6.0 版本之前,pgvector 仅支持使用单线程构建索引——这对于大型数据集来说是一个很大的瓶颈。例如,为 1536 维的 100 万个向量构建索引大约需要 1 小时 27 分钟(使用'm'=16, 'ef_construction'=200)。

通过并行索引构建,您可以在 9.5 分钟内为同一数据集构建索引 - 速度提高 9 倍:

pg向量

性能比较:pgvector 0.5 与 0.6

我们使用dbpedia-entities-openai-1M数据集(100 万条向量,1536 个维度)测试了索引构建时间,以比较并行和单线程 HNSW 索引构建的性能。同时,我们验证了生成的索引在准确率和每秒查询次数 (QPS) 方面是否相同。

我们对各种数据库大小运行基准测试,以了解并行构建的影响:

  • 4XL 实例(16 核 64GB RAM)
  • 16XL 实例(64 核 256GB RAM)

4XL 实例(16 核 64GB RAM)

该基准测试使用了以下参数:

0.5.1 0.6.0
维护工作内存 30GB 30GB
最大并行维护工作者数 - 15

max_parallel_maintenance_workers控制用于构建索引的并行线程数。在后续章节中,我们将使用包含领导者在内的工作线程总数。

pgvector 工作台

0.6.0 的索引构建时间快了 7-9 倍,而两个版本的每秒查询次数和准确率保持不变:

  • v0.5.1:所有基准测试的平均 QPS 为 938,准确率为 0.963。
  • v0.6.0:所有基准测试的平均 QPS 为 950,准确率为 0.963。

16XL 实例(64 核 256GB RAM)

您可以使用更强大的实例(这些参数最高可达 13.5 倍)进一步提高索引构建性能。

长凳 2

索引构建时间与所用核心数并非线性相关。合理的默认值max_parallel_maintenance_workersCPU count / 2,也就是我们在 Supabase 平台上设置的默认值。准确率和 QPS 不受 的影响max_parallel_maintenance_workers

未记录表的嵌入

使用未记录的表可以进一步减少构建时间。

Postgres 中的“未记录表”是指其修改不会记录在预写日志中的表(以性能换取数据可靠性)。“未记录表”非常适合嵌入,因为原始数据通常单独存储,并且可以随时从源数据重新创建嵌入。

索引创建的步骤之一是最终扫描和 WAL 写入。这通常很短,但无法并行化。使用未记录日志的表可以跳过 WAL 写入,带来显著的效果:

ef_construction 构建时间:v0.5.1 构建时间:v0.6.0(未记录) 改进
64 38分08秒 1分38秒 23倍
100 1小时06分59秒 2分10秒 31倍
200 1小时27分45秒 3分37秒 24倍

入门

pgvector 0.6.0刚刚发布,即将在 Supabase 项目中使用。再次特别感谢 Andrew Kane 以及所有参与并行索引构建工作的同事。

🚀 了解有关 Supabase 的更多信息

鏂囩珷鏉ユ簮锛�https://dev.to/supabase/pgvector-060-30x-faster-with-parallel-index-builds-i1l
PREV
Supabase Auth 现已支持匿名登录
NEXT
在 Supabase 上开始使用 Ruby on Rails 和 Postgres