建立及管理向量索引

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

事前準備

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

後續步驟