跳到主要内容

IVF 系列索引

本文档介绍了 seekdb 的稠密索引 IVF 系列索引的创建、搜索、删除语法说明及示例。

索引语法及说明

创建

IVF 系列索引包含 IVF 和 IVF_PQ 两种索引,其创建支持在建表时创建后建两种方式。创建时需要注意:

  • 创建向量索引必须带有 VECTOR 关键字。
  • 后建索引的参数和说明与建表时创建索引一致。
  • 如果数据量较大,建议先写完数据,再创建索引,以获得最佳搜索性能。
  • IVF/IVF_PQ 索引均建议在写入数据后再创建索引,并在写入较多增量数据后进行索引重建。每个索引具体的创建说明见下文具体示例。
  • 创建 IVF 索引时,索引名长度暂不支持超过 33 个字符,否则可能因为索引辅助表名长度超过 index_name 限制导致异常。未来版本会支持更长的索引名。

建表时创建

建表时创建索引语法:

CREATE TABLE table_name (
column_name1 data_type1,
column_name2 VECTOR(dim),
...,
VECTOR INDEX index_name (column_name2) WITH (param1=value1, param2=value2, ...)
);

后建索引

后建索引语法:

-- 后建索引支持设置并行度,以提升索引构建性能,并行度最大设置不超过 CPU 核数 * 2
CREATE [/*+ paralell $value*/] VECTOR INDEX index_name ON table_name(column_name2) WITH (param1=value1, param2=value2, ...);

param 参数说明:

参数默认值取值范围是否必填说明备注
distancel2/inner_product/cosine指定向量距离算法类型。l2 表示欧氏距离,inner_product 表示内积距离,cosine 表示余弦距离。
typeivf_flat/ivf_pq指定 IVF 索引类型。
libobob指定向量索引库类型。
nlist128[1,65536]聚类中心的个数。
sample_per_nlist256[1,int64_max]每个聚类中心的取样的数据量,后建索引中使用。
nbits8[1,24]指定量化位数。
该参数仅在创建 IVF_PQ 索引时可指定。
建议取值为 8,建议取值范围为 [8,10]。该值越大,量化精度越高,搜索准确率越高,同时搜索性能会受到影响。
m无默认值,必须指定[1,65536]指定量化后的向量维度。
该参数仅在创建 IVF_PQ 索引时可指定。
该值越大,索引构建越慢,搜索准确率越高,同时搜索性能会受到影响。

搜索

IVF 系列索引的搜索是一种近似最近邻(ANN)搜索,不保证 100% 的结果准确性。衡量其准确率的指标是召回率,例如在查询 10 个最近邻时,若能稳定返回 9 个正确结果,则召回率为 90%。

SELECT ... FROM table_name 
ORDER BY distance_function(column_name, vector_expr) [APPROXIMATE|APPROX]
LIMIT num (OFFSET num);

搜索语法要求:

  • 必须指定 APPROXIMATE/APPROX 关键字,搜索才会使用向量索引而非全表扫描。
  • 必须包含 ORDER BYLIMIT 子句。
  • ORDER BY 只支持单个向量条件。
  • LIMIT + OFFSET 的取值范围为 (0, 16384]
  • 不指定 LIMIT 子句会报错。

距离函数使用规则:

  • 指定 APPROXIMATE/APPROX,调用当前版本支持的距离函数,且与向量索引算法匹配,搜索会使用向量索引。
  • 指定 APPROXIMATE/APPROX,距离函数与向量索引算法不匹配,搜索不会使用向量索引,但也不会报错。
  • 指定 APPROXIMATE/APPROX,如果距离函数为当前版本不支持的距离函数,搜索不会使用向量索引,且会报错。
  • 未指定 APPROXIMATE/APPROX,调用当前版本支持的距离函数,搜索不会使用向量索引,但也不会报错。

其他说明:

  • WHERE 条件会作为向量索引搜索的过滤条件。
  • 召回率受构建参数和搜索参数的影响。
  • 索引搜索参数在建索引时指定,之后不可修改。但可通过 session 变量 ob_ivf_nprobes 设置搜索时的聚类中心数量。如果设置了 session 变量,会优先使用它的值。具体设置方式请参见 ob_ivf_nprobes

删除

删除向量索引的语法如下:

DROP INDEX index_name ON table_name;

创建、搜索及删除示例

建表时创建

IVF 示例

CREATE TABLE ivf_vecindex_suite_table_test (c1 INT, c2 VECTOR(3), PRIMARY KEY(c1), VECTOR INDEX idx2(c2) WITH (distance=l2, type=ivf_flat));

后建

IVF 示例

创建测试表。

CREATE TABLE vec_table_ivf (c1 INT, c2 VECTOR(3), PRIMARY KEY(c1));

创建 IVF 索引。

CREATE VECTOR INDEX vec_idx3 ON vec_table_ivf(c2) WITH (distance=l2, type=ivf_flat);

删除

DROP INDEX vec_idx1 ON vec_table;

查看删除的索引。

SHOW INDEX FROM vec_table;

返回结果如下:

Empty set

相关文档