本頁說明如何設定向量索引的記憶體,以及如何建立、調整、監控及刪除向量索引。
事前準備
建立向量索引之前,您必須先將資料載入至含有向量嵌入值的基本資料表。基準表格至少要有 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 會根據 VM 大小自動設定預設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
個值
VM 大小 | cloudsql_vector_max_mem_size |
4 GB | 194MB |
8 GB | 515MB |
16 GB | 1.2GB |
32 GB | 2.56GB |
64 GB | 5.12GB |
128 GB | 10.24GB |
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
陳述式: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 向量搜尋簡介。
- 瞭解如何在執行個體上啟用及停用向量嵌入項目。
- 瞭解如何產生向量嵌入項目。
- 瞭解如何針對向量嵌入執行搜尋。