本頁說明如何設定向量索引的記憶體,以及建立、調整、監控及捨棄向量索引。
事前準備
建立向量索引前,您必須先將向量嵌入值載入至基本資料表。基準表至少要有 1,000 列資料。如果可用的資料點越多,索引的分割和訓練效果就越好。
設定向量索引的記憶體分配
cloudsql_vector_max_mem_size
資料庫旗標可控制 Cloud SQL 執行個體要為向量索引分配多少記憶體。這是靜態旗標,需要重新啟動執行個體才會生效。這項記憶體有兩個主要用途:
儲存向量索引結構:向量索引的非葉片部分 (即
TREE_MEMORY
) 位於這個記憶體中。這棵樹的大約大小取決於葉節點 (num_leaves
) 數量和向量維度:Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
舉例來說,如果索引有 1000 個葉節點和 768 個維度,則大約為 1000 * 768 * 4 * 2 或 6144000 個位元組。
TREE_MEMORY
您也可以使用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
陳述式,標準 MySQL 語法的 Cloud SQL 擴充功能。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 向量搜尋總覽。
- 瞭解如何在執行個體上啟用及停用向量嵌入。
- 瞭解如何生成向量嵌入。
- 瞭解如何對向量嵌入執行搜尋。