建立及管理向量索引

本頁說明如何設定向量索引的記憶體,以及建立、調整、監控及捨棄向量索引。

事前準備

建立向量索引前,您必須先將向量嵌入值載入至基本資料表。基準表至少要有 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 個維度,則大約為 1000 * 768 * 4 * 2 或 6144000 個位元組。TREE_MEMORY您也可以使用 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 會根據 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 建立向量索引:

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

後續步驟