创建和管理向量索引

本页介绍了如何为向量索引配置内存,以及如何创建、调整、监控和删除向量索引。

准备工作

在创建向量索引之前,您必须将数据加载到包含向量嵌入值的基表中。您的基表必须至少具有 1,000 行。如果可用的数据点较多,则可以更好地对索引进行分区和训练。

为向量索引配置内存分配

cloudsql_vector_max_mem_size 数据库标志用于控制 Cloud SQL 实例专门用于向量索引的内存量。这是一个静态标志,需要重启实例。此内存有以下两个主要用途:

  1. 存储矢量索引结构:矢量索引的非叶子部分(TREE_MEMORY)位于此内存中。此树的近似大小取决于叶节点的数量 (num_leaves) 和向量的维度:

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    例如,一个包含 1, 000 个叶子和 768 个维度的索引的 TREE_MEMORY 大约为 1000 * 768 * 4 * 2 或 6144000 字节。您还可以使用 information_schema.innodb_vector_indexes 表格检查实际 TREE_MEMORY。Cloud SQL 会管理该内存。您无需同时为所有向量索引分配空间,因为系统会卸载闲置的索引以腾出空间来处理其他请求。

  2. 用于创建索引的内存(训练数据):在创建向量索引期间,需要内存来处理基表中的数据样本,以便构建索引。此内存仅在索引创建过程中使用,之后会被释放。训练所需的内存大致大小为:

     approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensions
    

    例如,如果表有 1,000,000 行和 768 个维度,则 training_memory 将为 1000000 * 0.1 * 768 * 4,即 307,200,000 字节。系统仅会对基表数据的 10% 进行抽样,以计算树的质心。

    启用 cloudsql_vector 标志后,Cloud SQL 会根据您的虚拟机大小自动设置默认 cloudsql_vector_max_mem_size。此默认值通常足以满足典型工作负载的需求。Cloud SQL 会降低 innodb_buffer_pool_size 标志以分配此内存。cloudsql_vector_max_mem_size 的默认最大值为 16GB。如果您需要调整内存大小,可以根据向量索引用量动态调整 cloudsql_vector_max_mem_size

    重要提示:如果您增加 cloudsql_vector_max_mem_size,则必须相应地减少 innodb_buffer_pool_size,以免出现内存问题。

cloudsql_vector_max_mem_size 个值

虚拟机大小 cloudsql_vector_max_mem_size
4GB 194MB
8 GB 515MB
16 GB 1.2GB
32 GB 2.56GB
64GB 5.12GB
128GB 10.24GB
256GB 以上 16 GB

分配的矢量索引内存范围如下:

  • 至少 128MB
  • 缓冲池的 10%
  • 上限为 16 GB

您可以根据需要稍后调整内存。如需了解详情,请参阅为向量嵌入启用数据库标志

如需了解如何监控向量索引的大小,请参阅监控向量索引

如需更新为实例的向量索引分配的内存,请使用以下命令:

gcloud sql instances patch INSTANCE_NAME \
 --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE;

替换以下内容:

  • INSTANCE_NAME:您要对其更改内存分配的实例的名称。
  • NEW_MEMORY_VALUE:向量索引更新后的内存分配(以字节为单位)。

此更改会在数据库重启后立即生效。

创建矢量索引

您可以通过以下两种方式创建矢量索引:

使用以下语法使用 CREATE VECTOR INDEX 创建向量索引:

CREATE
  VECTOR INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
USING
  SCANN[QUANTIZER = SQ8]
    DISTANCE_MEASURE
  = L2_SQUARED | COSINE | DOT_PRODUCT[NUM_LEAVES = INT_VALUE { '</var>' }}];

以下是索引选项:

  • USING SCANN:可选。指明要使用的索引类型。SCANN 是唯一支持的值。
  • QUANTIZER:可选。将高维向量映射到压缩表示法。SQ8 是唯一支持的值。
  • DISTANCE_MEASURE:必填。指定用于计算两个向量相似度的数学公式。您必须在此参数中设置与 approx_distance 搜索选项中设置的距离相同的距离测量单位。支持的字面量包括:
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES:可选。指定要构建的分区(叶)数量。 只有在您对 ANN 搜索和数据集非常了解的情况下,才应将此设置从默认设置更改为其他设置。指定的数字不得大于基表中的嵌入数量。

例如,如需创建向量索引,请运行以下命令:

CREATE
  VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;

CREATE 语句运行期间,基表会被置于只读模式,并且不允许对基表执行 DML 操作。

您可以使用以下语法在现有表上创建索引:

ALTER TABLE tbl_name
  ADD VECTOR INDEX index_name(key_part)[index_option];

例如,如需在现有表上创建索引,请执行以下操作:

ALTER TABLE t1 ADD VECTOR INDEX index1(j)
USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared NUM_LEAVES = 10;

调整向量索引

本部分详细介绍了用于构建矢量索引的参数。如需调整向量索引,请使用这些信息确定如何影响构建过程。

参数 说明 默认 范围 影响
cloudsql_vector_max_mem_size 为索引训练分配的内存。 不定 实例 内存不足可能会导致构建失败。请参阅为向量索引配置内存分配
innodb_ddl_threads 索引训练和构建的并行处理程度。 4 会话 值越高,构建时间越短,但 CPU 负载越高。将此值设置为您可以腾出的 CPU 数量,而不影响数据库操作。

确保 cloudsql_vector_max_mem_size 已正确配置以进行训练。调整 innodb_ddl_threads 以平衡构建时间和 CPU 负载,同时考虑对并发数据库操作的影响。监控构建期间的 CPU 利用率。

删除向量索引

如需删除向量索引,请使用 SQL DROP INDEXALTER TABLE 语句,并附上要删除的索引名称,如下所示:

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

监控向量索引

Cloud SQL 提供了以下信息架构表,其中包含有关内存中加载的向量索引的实时信息:

  • information_schema.innodb_vector_indexes 会列出重启后在内存中打开的所有向量索引。
  • information_schema.innodb_all_vector_indexes 会列出实例上存在的所有矢量索引(即使它们尚未在内存中打开)。
  • information_schema.innodb_vector_indexes_memory 提供有关实例中向量索引总内存用量的信息。

如需了解详情,请参阅信息架构

如需查看 innodb_vector_indexes 表中的信息,请运行以下命令:

SELECT * FROM information_schema.innodb_vector_indexes \ G;

输出类似于以下内容:

 INDEX_NAME: t1_vec_index
 TABLE_NAME: test.t1
 INDEX_TYPE: TREE_SQ
 DIMENSION: 3
 DIST_MEASURE: COSINE
 STATUS: Ready
 STATE: INDEX_READY_TO_USE
 NUM_LEAVES: 10
 NUM_LEAVES_TO_SEARCH: 10
 QUERIES: 1
 MUTATIONS: 1
 TREE_MEMORY: 443

后续步骤