本页面介绍了如何为向量索引配置内存,以及如何对向量索引进行创建、调优、监控和删除。
准备工作
在创建向量索引之前,您必须使用向量嵌入值将数据加载到基表中。您的基表必须至少具有 1,000 行。 如果可用的数据点较多,则可以更好地对索引进行分区和训练。
为向量索引配置内存分配
cloudsql_vector_max_mem_size
数据库标志控制 Cloud SQL 实例专门用于向量索引的内存量。这是一个静态标志,需要重启实例。此内存主要用于以下两种用途:
存储向量索引结构:向量索引的非叶部分 (
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 会管理该内存。您无需同时为所有向量索引分配空间,因为系统会卸载不活跃的索引,为其他请求腾出空间。用于创建索引(训练数据)的内存:在创建向量索引期间,需要使用内存来处理来自基表的数据样本,以便构建索引。此内存仅在索引创建过程中使用,之后会被释放。训练所需内存的近似大小如下:
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
语句,这是针对标准 MySQL 语法的 Cloud SQL 扩展。- 带有 Cloud SQL
ADD VECTOR INDEX
子句扩展的ALTER TABLE
语句。您无法对表同时运行此语句和其他 DDL 语句。
使用以下语法可通过 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 INDEX
或 ALTER 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
后续步骤
- 阅读 Cloud SQL 中的向量搜索概览。
- 了解如何在实例上启用和停用向量嵌入。
- 了解如何生成向量嵌入。
- 了解如何对向量嵌入执行搜索。