Page 98 - 《软件学报》2026年第3期
P. 98

邱海浪 等: LSMDiskANN: 更新友好型磁盘向量索引框架                                                1061


                 数量有限, 从而实现内存占用与查询效率的平衡.
                  1.3   动态向量索引
                    伴随向量数据体量的迅猛增长, 其更新频率也呈现爆炸式提升. 例如, YouTube 每分钟有超过                        500 h  的视频内
                 容上传  [44] , 京东每天有亿级的图像数据产生        [45] , 阿里巴巴在双十一期间产生超      500 PB  非结构化数据   [20] . 对于传统
                 向量索引, 处理更新的策略就是定期重建整个索引, 这在实际生产环境中成本极高, 种种需求催生了动态向量索引
                 的研究.
                    动态向量索引的研究方向主要包括两方面. (1) 一方面是改进现有索引算法, 使其支持更新操作, 从而避免频
                 繁重建整个索引. 这方面的两个代表性工作是微软提出的                  SPFresh [17] 与  FreshDiskANN [18] , 二者分别基于  SPANN  和
                 DiskANN  拓展了更新能力. 前者解决了倒排索引在更新过程中倒排列表长度失衡问题; 后者解决了图索引更新效
                 率等问题. (2) 另一方面则聚焦于设计更适合高频更新场景的索引架构, 进而提升索引的吞吐量. 例如: AnalyticDB-V                      [20]
                 通过批处理层和流处理层的两层架构设计, 实现数据的对外无感更新, 但其底层向量索引仍是静态, 从而引发更新
                 性能问题; 作为典型      NoSQL  数据库, Milvus [21] 采用基于  LSM  的存储架构, 将数据表划分为多个分片, 并在每个分
                 片上构建静态向量索引, 在数据表进行合并时同步重建向量索引, 达到无感更新效果. 但是受限于嵌入式索引与数
                 据表高度耦合的缺点; FreshDiskANN      本质上可看作单层       LSM  结构, 其在内存中维护增量数据并定期合并至磁盘
                 主索引. 但是由于单层的限制, 每当内存索引写满时即需合并, 导致合并操作过于频繁, 严重影响前台查询性能.
                    此外, 近期还有两项针对        FreshDiskANN  的改进研究: IP-DiskANN  [46] 为减少合并操作删除阶段的邻居修补开
                 销, 通过查询结果来近似删除点的入边邻居列表, 但该方法会不断累积逻辑删除的冗余边, 从而需要额外引入索引
                 的定期清理操作; Greator   [25] 则引入图拓扑结构独立存储方案, 将图拓扑结构作为一种向量索引的索引, 结合局部更
                 新策略和近似剪枝策略提高小批量更新场景下的合并操作效率. 但是, 小批量更新场景的实际应用意义值得商榷,
                 且图拓扑结构的额外单独存储在大部分高维向量数据集下, 其所引发的额外存储开销比例不容小觑 (如                                  SIFT  中,
                 在邻居列表长度为       64  时, 比例为  50%). 总而言之, 上述两项研究均侧重于算法层面的调整与修改, 而本文的创新
                 则侧重于调整索引布局与架构设计, 因此彼此互补且不冲突.

                  1.4   LSM  次级索引
                    在  NoSQL  数据库中, 为支持大规模数据的高效写入, 同时兼具灵活性与可拓展性, 基于                      LSM  的存储架构被
                 广泛采用. 其将主表存储设计为多层可合并的组件, 兼顾写入吞吐与查询性能. 但实际应用中, 除了主键查询, 往往
                 还需在非主键列上建立索引, 即“次级索引”. 如何保证次级索引在高写入负载下仍能高效更新, 成为                             NoSQL  领域
                 的研究焦点    [47] . 其中, 一大解决方案则是将次级索引也        LSM  化, 这类索引统称为     LSM  次级索引, 包括: LSM    倒排
                 索引  [48] 、LSM B  树  [49] 、LSM R  树  [49−51] 等, 其中, 本文所提框架设计灵感则来源于  LSM R  树——用于支持空间数
                 据的  KNN  与范围查询的树索引结构, 在        Apache AxterixDB [49] 中有完整的开源实现.
                    在架构上, LSM R    树由内存层与磁盘层组成, 称为“组件”. 内存层组件包含                R  树与记录删除键的      B+树, 磁盘
                 层组件则额外加入布隆过滤器用于快速过滤删除标记. 当写入操作执行时, 数据首先写入内存组件, 内存组件写满
                 后刷新为磁盘组件. 当磁盘组件数量超过阈值               C  时, 将根据合并策略    (如  Constant 或  Prefix) 执行合并. 当  KNN  搜
                 索执行时, 需遍历所有组件, 按照生命周期从老到新逐个进行查询与删除键的过滤. 通过                           LSM  化改造, AsterixDB
                 显著提升了读写混合场景下的系统吞吐与               QPS, 也为本文提出的基于       LSM  思想的磁盘向量索引框架提供了强有
                 力的可行性支撑.

                  2   基础知识

                    本文所提架构主要基于         FreshDiskANN [18] 进行改进, 下面就相关概念和系统基本过程予以介绍.
                  2.1   K  近似近邻查询
                    K  近邻 (KNN) 查询常用于从大规模数据集中检索与给定查询项相似的数据. 在向量数据库中, 数据以向量形
                 式表示, KNN 查询即为寻找与查询向量最接近的              K  个向量. 在实际应用中, KNN     查询广泛用于如下场景: (1) 检索
   93   94   95   96   97   98   99   100   101   102   103