创建和管理向量索引

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

准备工作

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

为向量索引配置内存分配

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

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

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    例如,如果一个索引包含 1000 个叶节点和 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 的默认最大值为 16 GB。如果您需要对内存大小进行调优,可以根据向量索引用量动态调整 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 194 MB
8 GB 515 MB
16 GB 1.2 GB
32 GB 2.56 GB
64GB 5.12 GB
128GB 10.24 GB
大于 256 GB 16 GB

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

  • 最小 128 MB
  • 缓冲区池的 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

后续步骤