首批通过分布式安全可靠测评,为关键业务系统打造
向量索引
更新时间:2026-06-29 11:29:36
本文介绍 HNSW 系列索引和 IVF 系列索引的原理。
HNSW 系列索引
OceanBase 数据库的 HNSW 向量索引,分为静态基线索引和动态增量索引两部分:静态基线索引只读,一旦生成不再修改;动态增量索引支持读写。DML(插入、更新、删除)先写入动态增量索引;当增量达到一定规模时转储到磁盘。查询时分别查询静态基线索引和动态增量索引,将结果归并后返回给 SQL 层。 当增量部分达到一定规模时,会触发增量与基线的合并,以控制 Segment 数量、保证查询性能。
索引存储
数据组织
向量索引的数据组织引入了段(Segment)概念,分区内按段组织数据。引入持久化增量后,存在四类段:

| 段 | 说明 | 存储位置 | 读写 |
|---|---|---|---|
| 基线索引 | 全量重建产生的只读索引 | 磁盘 | 只读 |
| 活跃增量 | 内存中可写的增量索引 | 内存 | 读写 |
| 冻结增量 | 活跃增量满后冻结 | 内存 | 只读 |
| 已持久化增量 | 冻结后落盘的增量 | 磁盘 | 只读 |
其他说明:
- 单分区仅有一个基线段,可有多个增量段。
- 增量段可能含未提交/回滚数据,需配合可见性位图过滤。
转储与合并
转储
将内存中的增量数据持久化到磁盘,并收缩日志表,主要流程如下:
- 冻结:当活跃增量达到阈值(如内存/行数),将其冻结(不再写入) → 产生冻结增量
- 持久化:将冻结增量序列化,写入磁盘存储
- 更新元数据:更新索引的元数据(版本号、段列表)
合并
| 类型 | 触发条件 | 作用 |
|---|---|---|
| 增量合并 | 已持久化增量 ≥ 2 个 | 合并多个增量,减少查询时的归并开销 |
| 基线重建 | 增量向量数超过基线 | 全量重建,生成新的只读基线索引 |
说明
合并可同时做量化压缩(如 FP32 → SQ/BQ),节省存储空间。
过滤器
查询时支持两种过滤器:
| 场景 | 说明 |
|---|---|
| Pre_filter | 先过滤主表数据,再查向量索引(适合过滤条件筛选性强的场景) |
| Post_filter | 查询向量索引后,在候选结果上过滤(适合大多数向量结果都有效的情况) |
常见问题
Q:为什么要分基线和增量两阶段构建?
A:向量索引库(HNSW)构建索引代价高,不适合频繁更新。改为:
- 基线:只读,定期全量重建,适合查询。
- 增量:内存可写,支持实时 DML,定期合并到基线。
IVF 系列索引
IVF 系列索引是基于倒排的向量索引,通过聚类算法将高维向量空间划分为 nlist 个由聚类中心点(Centroids)定义的子区域,每个聚类中心关联一个倒排桶,用于存储归属于该区域的向量(或其量化压缩编码)。搜索时只访问与查询向量最相近的若干桶,从而在计算开销与检索精度之间取得了平衡。
索引内部结构
IVF 系列索引在逻辑上可分为两层:
- 聚类中心层(粗聚类层):维护
nlist个中心向量,用于决定查询应优先探测哪些桶。搜索参数nprobe表示选取距离查询最近的若干个中心所对应的桶。 - 倒排桶数据层:每个中心对应一个桶,桶内存储落入该聚类区域的向量条目(可配合乘积量化等压缩表示)。
聚类中心层(粗聚类层)有两种主要的物理组织方式,分别适用于不同规模的 nlist:
| 组织形式 | 适用场景 | 搜索方式 | 特点 |
|---|---|---|---|
| ARRAY | nlist 较小 | 线性距离计算后排序选 top | 实现简洁,开销常数小 |
| HGRAPH | nlist 较大 | 图结构遍历 | 支持大规模中心,高效 |
在实际应用中,中心加载入内存后会根据规模自动选用最佳组织方式。当 nlist 未达到阈值时,采用 ARRAY 结构;超过阈值则构建 HGraph,并根据实现策略可以释放原有的大块连续数组,后续均通过统一接口访问中心信息。