In questa pagina viene descritto 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 vector embedding. La tabella di base deve contenere almeno 1000 righe. Se hai più punti dati disponibili, puoi ottenere una migliore partizione e un migliore addestramento dell'indice.
Attiva il flag di database cloudsql_vector
sulla tua istanza Cloud SQL.
Per le istanze che utilizzano Cloud SQL per MySQL 9.7 o versioni successive, anche se non è necessario attivare cloudsql_vector per creare e archiviare vector embedding, devi attivare il flag di database cloudsql_vector nell'istanza Cloud SQL per creare indici vettoriali.
Configura l'allocazione della memoria per gli indici vettoriali
Il flag di database cloudsql_vector_max_mem_size controlla la quantità di memoria che l'istanza Cloud SQL dedica agli indici vettoriali. Questo è un flag statico che richiede il riavvio dell'istanza. Questa memoria ha due scopi principali:
Archiviazione della struttura dell'indice vettoriale: la parte non contenente nodi foglia dell'indice vettoriale (
TREE_MEMORY) risiede in questa memoria. La dimensione approssimativa di questo albero dipende dal numero di nodi foglia (num_leaves) e dalle dimensioni dei vettori:Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2Ad esempio, un indice con 1000 foglie e 768 dimensioni avrebbe un valore
TREE_MEMORYapprossimativo di 1000 * 768 * 4 * 2 o 6144000 byte. Puoi anche controllare il valore effettivo diTREE_MEMORYutilizzando la tabellainformation_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.Memoria per la creazione dell'indice (dati di addestramento): durante la creazione dell'indice vettoriale, è necessaria 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 dimensionsAd esempio, con una tabella di 1.000.000 di righe e 768 dimensioni, il valore di
training_memorysarebbe 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 per l'albero.Quando attivi il flag
cloudsql_vector, Cloud SQL imposta automaticamente un valorecloudsql_vector_max_mem_sizepredefinito in base alle dimensioni della VM. In genere, questa impostazione predefinita è sufficiente per i workload tipici. Cloud SQL riduce il flaginnodb_buffer_pool_sizeper allocare questa memoria. Il valore massimo predefinito percloudsql_vector_max_mem_sizeè 16 GB. Se devi ottimizzare le dimensioni della memoria, puoi regolare dinamicamentecloudsql_vector_max_mem_sizein base all'utilizzo dell'indice vettoriale.
cloudsql_vector_max_mem_size valori
| Dimensioni della 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 |
| +256 GB | 16 GB |
L'intervallo di memoria allocata per l'indice vettoriale è il seguente:
- Minimo 128 MB
- 10% del pool di buffer
- 16 GB massimo
Puoi regolare la memoria in un secondo momento, in base alle tue esigenze.
Per informazioni sul monitoraggio delle dimensioni dell'indice vettoriale, consulta Monitora gli indici vettoriali.
Per aggiornare l'allocazione della memoria per gli indici vettoriali nell'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 della memoria.
- NEW_MEMORY_VALUE: l'allocazione della memoria aggiornata, in byte, per gli indici vettoriali.
Questa modifica diventa effettiva immediatamente dopo il riavvio del database.
Crea un indice vettoriale
Esistono due modi per creare un indice vettoriale:
- Istruzione
CREATE VECTOR INDEX, un'estensione di Cloud SQL per la sintassi MySQL standard. - Istruzione
ALTER TABLEcon l'estensione della clausolaADD VECTOR INDEXdi 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 ];
Di seguito sono riportate le opzioni di indicizzazione:
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. In questo parametro devi impostare la stessa misura della distanza impostata nelle opzioni di ricerca diapprox_distance. I valori letterali supportati sono:L2_SQUAREDCOSINEDOT_PRODUCT
NUM_LEAVES: facoltativo. Specifica il numero di partizioni (foglie) da creare. Modifica questa impostazione rispetto al valore predefinito 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 embedding 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;
Durante l'esecuzione dell'istruzione CREATE, la tabella di base viene impostata in modalità di sola lettura e non sono consentite istruzioni DML sulla tabella di base.
Per creare un indice su una tabella esistente, puoi utilizzare la seguente sintassi:
ALTER TABLE tbl_name
ADD VECTOR INDEX index_name(key_part)[index_option];
Ad esempio, per creare un indice su 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 influenzare il processo di compilazione.
| Parametro | Descrizione | Predefinito | Ambito | Impatto |
cloudsql_vector_max_mem_size |
Memoria allocata per l'addestramento dell'indice. | Variabile | Istanza | La memoria insufficiente può causare errori di build. Consulta Configura 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ù elevati riducono il tempo di build, 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 in modo appropriato per l'addestramento.
Regola innodb_ddl_threads per bilanciare il tempo di creazione 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 delle informazioni con informazioni in tempo reale sugli indici vettoriali caricati nella memoria:
information_schema.innodb_vector_indexeselenca tutti gli indici vettoriali aperti nella memoria dopo il riavvio.information_schema.innodb_all_vector_indexeselenca tutti gli indici vettoriali esistenti nell'istanza (anche se non sono ancora aperti in memoria).information_schema.innodb_vector_indexes_memoryfornisce informazioni sull'utilizzo complessivo della memoria utilizzata degli indici vettoriali nell'istanza.
Per informazioni più dettagliate, consulta lo schema di 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
Best practice per l'utilizzo degli indici vettoriali
Questa sezione fornisce le best practice per l'utilizzo degli indici vettoriali. Ogni workload è diverso e potrebbe essere necessario apportare modifiche di conseguenza.
- Dopo le principali operazioni di Data Manipulation Language (DML), è buona norma ricostruire l'indice.
- In genere, è accettabile consentire a Cloud SQL di calcolare il numero di foglie o contenitori per gli embedding da utilizzare. Il numero di foglie determina in quante partizioni è diviso l'indice vettoriale. Se hai un caso d'uso in cui vuoi specificare il numero di foglie, ti consigliamo di avere almeno 100 vettori per foglia per un richiamo ottimale. Nel contesto di Vector Search, il recall si riferisce alla percentuale di vettori restituiti dall'indice che sono i vicini più prossimi effettivi.
Passaggi successivi
- Leggi la panoramica su Vector Search su Cloud SQL.
- Scopri come attivare e disattivare i vector embedding nell'istanza.
- Scopri come generare vector embedding.
- Scopri come eseguire ricerche sui vector embedding.