ALTER REINDEX

ALTER TABLE … ALTER REINDEX 用于对向量表中的数据重新进行分区。

语法说明

ALTER TABLE ... ALTER REINDEX 用于对向量表中的数据重新进行分区。

当向量表内的数据记录大幅增长时,原有的聚类中心集合可能不再适用。为此,我们必须对数据重新进行索引处理,旨在识别出新的聚类中心,并据此重新划分数据集。

备注

在重构索引期间,无法对该表进行数据插入操作。

LISTS 的理想值为:

  • 如果总行数<1000000:lists=总行数/1000

  • 如果总行数>1000000:lists=sqrt(总行数)

语法结构

> ALTER TABLE table_name ALTER REINDEX index_name algorithm [option_list]
  • table_name:包含索引的表名。

  • index_name:要重建的索引名称。

  • algorithm:重建时使用的索引算法。必须与索引的现有算法类型匹配。支持的值:ivfflathnsw

  • option_list:算法特定的构建选项。

每种算法在重建时接受其支持的构建选项(将其合并到持久化的算法参数中,可通过 SHOW CREATE TABLE 查看),并拒绝其不支持的选项并报错。

IVF-FLAT 重建选项

对于 IVF-FLAT 索引,ALTER REINDEX 支持以下选项:

选项

描述

lists

聚类分区数。必须大于 0。

kmeans_train_percent

用于 k 均值训练的数据百分比。

kmeans_max_iteration

k 均值聚类的最大迭代次数。

IVF-FLAT 不支持的选项(如 mef_constructionef_searchgraph_degree)会被拒绝并报错。

HNSW 重建选项

对于 HNSW 索引,ALTER REINDEX 支持以下选项:

选项

描述

m

每个节点的最大邻居连接数。控制图的密度。

ef_construction

构建索引时的扩展因子。

ef_search

查询时的扩展因子。

max_index_capacity

HNSW 图的最大索引容量。

HNSW 不支持的选项(如 listskmeans_train_percentkmeans_max_iteration)会被拒绝并报错。

示例

IVF-FLAT 重建

DROP DATABASE IF EXISTS dbreindex;
CREATE DATABASE dbreindex;
USE dbreindex;

CREATE TABLE t1(n1 INT, n2 VECF32(4));
INSERT INTO t1 VALUES(1,"[1,2,3,4]"),(2,"[5,6,7,8]"),(3,"[9,10,11,12]");
CREATE INDEX idx_t1 USING ivfflat ON t1(n2) LISTS=2 OP_TYPE "vector_l2_ops";

ALTER TABLE t1 ALTER REINDEX idx_t1 ivfflat LISTS=4 kmeans_train_percent=80 kmeans_max_iteration=50;

DROP DATABASE dbreindex;

HNSW 重建

DROP DATABASE IF EXISTS dbreindex;
CREATE DATABASE dbreindex;
USE dbreindex;

CREATE TABLE hnsw_t(a BIGINT PRIMARY KEY, b VECF32(4));
INSERT INTO hnsw_t VALUES(1,"[1,2,3,4]"),(2,"[5,6,7,8]"),(3,"[9,10,11,12]");
CREATE INDEX hidx USING hnsw ON hnsw_t(b) OP_TYPE "vector_l2_ops" M=48 EF_CONSTRUCTION=64 EF_SEARCH=64;

ALTER TABLE hnsw_t ALTER REINDEX hidx hnsw M=32 EF_CONSTRUCTION=128 EF_SEARCH=100 MAX_INDEX_CAPACITY=100000;

DROP DATABASE dbreindex;