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 参数说明:
| 参数 | 默认值 | 取值范围 | 是否必填 | 说明 | 备注 |
|---|---|---|---|---|---|
| distance | l2/inner_product/cosine | 是 | 指定向量距离算法类型。 | l2 表示欧氏距离,inner_product 表示内积距离,cosine 表示余弦距离。 | |
| type | ivf_flat/ivf_pq | 是 | 指定 IVF 索引类型。 | ||
| lib | ob | ob | 否 | 指定向量索引库类型。 | |
| nlist | 128 | [1,65536] | 否 | 聚类中心的个数。 | |
| sample_per_nlist | 256 | [1,int64_max] | 是 | 每个聚类中心的取样的数据量,后建索引中使用。 | |
| nbits | 8 | [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 BY和LIMIT子句。 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