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