Creare e gestire gli indici di vettori

Questa pagina descrive come configurare la memoria per gli indici vettoriali e come creare, ottimizzare, monitorare ed eliminare gli indici vettoriali.

Prima di iniziare

Prima di creare un indice vettoriale, devi caricare i dati nella tabella di base con i valori di incorporamento vettoriale. La tabella di base deve contenere almeno 1000 righe. Se hai a disposizione più punti dati, puoi ottenere una migliore partizione e un migliore addestramento dell'indice.

Configurare l'allocazione della memoria per gli indici vettoriali

Il flag di database cloudsql_vector_max_mem_size controlla la quantità di memoria che la tua istanza Cloud SQL dedica agli indici vettoriali. Si tratta di un flag statico che richiede il riavvio dell'istanza. Questo ricordo ha due scopi principali:

  1. Memorizzazione della struttura dell'indice vettoriale:la parte non foglia dell'indice vettoriale (TREE_MEMORY) risiede in questa memoria. Le dimensioni approssimative di questo albero dipendono dal numero di nodi foglia (num_leaves) e dalle dimensioni dei vettori:

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Ad esempio, un indice con 1000 foglie e 768 dimensioni avrebbe un TREE_MEMORY approssimativo di 1000 * 768 * 4 * 2 o 6144000 byte. Puoi anche controllare il TREE_MEMORY effettivo utilizzando la tabella information_schema.innodb_vector_indexes. Cloud SQL gestisce questa memoria. Non è necessario allocare spazio per tutti gli indici vettoriali contemporaneamente, poiché gli indici inattivi vengono scaricati per fare spazio ad altre richieste.

  2. Memoria per la creazione dell'indice (dati di addestramento): durante la creazione dell'indice vettoriale, è necessaria la memoria per elaborare un campione dei dati della tabella di base per creare l'indice. Questa memoria viene utilizzata solo durante il processo di creazione dell'indice e viene liberata in seguito. La dimensione approssimativa della memoria necessaria per l'addestramento è:

     approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensions
    

    Ad esempio, con una tabella di 1.000.000 di righe e 768 dimensioni, il training_memory sarebbe 1.000.000 * 0,1 * 768 * 4 o 307.200.000 byte. Viene campionato solo il 10% dei dati della tabella di base per calcolare i centroidi dell'albero.

    Quando attivi il flag cloudsql_vector, Cloud SQL imposta automaticamente un valore predefinito cloudsql_vector_max_mem_size in base alle dimensioni della VM. Questo valore predefinito è in genere sufficiente per i carichi di lavoro tipici. Cloud SQL riduce il flag innodb_buffer_pool_size per allocare questa memoria. Il valore massimo predefinito per cloudsql_vector_max_mem_size è 16 GB. Se devi regolare la dimensione della memoria, puoi modificare dinamicamente cloudsql_vector_max_mem_size in base all'utilizzo dell'indice vettoriale.

    Importante: se aumenti cloudsql_vector_max_mem_size, devi diminuire di conseguenza innodb_buffer_pool_size per evitare problemi di memoria.

cloudsql_vector_max_mem_size valori

Dimensione VM cloudsql_vector_max_mem_size
4 GB 194MB
8 GB 515MB
16 GB 1,2 GB
32 GB 2,56 GB
64 GB 5,12 GB
128 GB 10,24 GB
256GB+ 16 GB

L'intervallo di memoria dell'indice vettoriale allocata è il seguente:

  • Minimo 128 MB
  • 10% del pool di buffer
  • Massimo 16 GB

Puoi regolare la memoria in un secondo momento, se necessario. Per ulteriori informazioni, vedi Attivare il flag del database per gli incorporamenti vettoriali.

Per informazioni sul monitoraggio delle dimensioni dell'indice vettoriale, vedi Monitorare gli indici vettoriali.

Per aggiornare la memoria allocata per gli indici vettoriali sull'istanza, utilizza il seguente comando:

gcloud sql instances patch INSTANCE_NAME \
 --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE;

Sostituisci quanto segue:

  • INSTANCE_NAME: il nome dell'istanza su cui stai modificando l'allocazione di memoria.
  • NEW_MEMORY_VALUE: l'allocazione di memoria aggiornata, in byte, per gli indici dei vettori.

Questa modifica ha effetto immediato dopo il riavvio di un database.

Crea un indice vettoriale

Esistono due modi per creare un indice vettoriale:

  • CREATE VECTOR INDEXstatement, un'estensione Cloud SQL della sintassi MySQL standard.
  • istruzione ALTER TABLE con l'estensione della clausola ADD VECTOR INDEX di Cloud SQL. Non puoi eseguire questa istruzione contemporaneamente ad altre istruzioni DDL sulla tabella.

Utilizza la seguente sintassi per creare un indice vettoriale utilizzando 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>' }}];

Di seguito sono riportate le opzioni di indice:

  • USING SCANN: facoltativo. Indica il tipo di indice da utilizzare. SCANN è l'unico valore supportato.
  • QUANTIZER: facoltativo. Mappa un vettore ad alta dimensionalità in una rappresentazione compressa. SQ8 è l'unico valore supportato.
  • DISTANCE_MEASURE: obbligatorio. Specifica una formula matematica da utilizzare per calcolare la somiglianza di due vettori. Devi impostare la stessa unità di misura della distanza in questo parametro e nelle opzioni di ricerca approx_distance. I valori letterali supportati sono:
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES: facoltativo. Specifica il numero di partizioni (foglie) da creare. Modifica questa impostazione rispetto a quella predefinita solo se hai una buona comprensione della ricerca ANN e del tuo set di dati. Il numero specificato non può essere maggiore del numero di incorporamenti nella tabella di base.

Ad esempio, per creare un indice vettoriale, esegui questo comando:

CREATE
  VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;

Mentre l'istruzione CREATE è in esecuzione, la tabella di base viene inserita in modalità di sola lettura e non sono consentite istruzioni DML sulla tabella di base.

Puoi utilizzare la seguente sintassi per creare un indice in una tabella esistente:

ALTER TABLE tbl_name
  ADD VECTOR INDEX index_name(key_part)[index_option];

Ad esempio, per creare un indice in una tabella esistente:

ALTER TABLE t1 ADD VECTOR INDEX index1(j)
USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared NUM_LEAVES = 10;

Ottimizza l'indice vettoriale

Questa sezione fornisce ulteriori informazioni sui parametri utilizzati per creare l'indice vettoriale. Per ottimizzare l'indice vettoriale, utilizza queste informazioni per determinare come influire sulprocesso di compilazionee.

Parametro Descrizione Predefinito Ambito Impatto
cloudsql_vector_max_mem_size Memoria allocata per l'addestramento dell'indice. Variabile Istanza Una memoria insufficiente può causare errori di compilazione. Consulta Configurare l'allocazione della memoria per gli indici vettoriali.
innodb_ddl_threads Grado di parallelismo per l'addestramento e la creazione dell'indice. 4 Sessione Valori più alti riducono il tempo di compilazione, ma aumentano il carico della CPU. Imposta questo valore sul numero di CPU che puoi risparmiare senza influire negativamente sulle operazioni del database.

Assicurati che cloudsql_vector_max_mem_size sia configurato correttamente per l'addestramento. Regola innodb_ddl_threads per bilanciare il tempo di compilazione e il carico della CPU, tenendo conto dell'impatto sulle operazioni simultanee del database. Monitora l'utilizzo della CPU durante la build.

Elimina un indice vettoriale

Per eliminare un indice vettoriale, utilizza le istruzioni SQL DROP INDEX o ALTER TABLE con il nome dell'indice che vuoi eliminare, come mostrato di seguito:

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

Monitora gli indici vettoriali

Cloud SQL fornisce le seguenti tabelle dello schema informativo con informazioni in tempo reale sugli indici vettoriali caricati nella sua memoria:

  • information_schema.innodb_vector_indexes elenca tutti gli indici vettoriali aperti in memoria dopo il riavvio.
  • information_schema.innodb_all_vector_indexes elenca tutti gli indici vettoriali esistenti nell'istanza (anche se non sono ancora aperti nella memoria).
  • information_schema.innodb_vector_indexes_memory fornisce informazioni sull'utilizzo complessivo della memoria degli indici vettoriali nell'istanza.

Per informazioni più dettagliate, consulta lo schema delle informazioni.

Per visualizzare le informazioni nella tabella innodb_vector_indexes, esegui questo comando:

SELECT * FROM information_schema.innodb_vector_indexes \ G;

L'output è simile al seguente:

 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

Passaggi successivi