Questa pagina descrive come configurare la memoria per gli indici di vettori e come creare, ottimizzare, monitorare ed eliminare gli indici di vettori.
Prima di iniziare
Prima di creare un indice di vettori, devi caricare i dati nella tabella di base con i valori di embedding dei vettori. La tabella di base deve contenere almeno 1000 righe. Se hai più punti dati disponibili, puoi ottenere una migliore suddivisione e addestramento dell'indice.
Configurare l'allocazione della memoria per gli indici di vettori
Il flag di database cloudsql_vector_max_mem_size
controlla la quantità di memoria che la tua istanza Cloud SQL dedica agli indici di vettori. Si tratta di un flag statico
che richiede il riavvio dell'istanza. Questa memoria ha due scopi principali:
Archiviazione della struttura dell'indice vettoriale: la parte non a 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 valore
TREE_MEMORY
approssimativo di 1000 * 768 * 4 * 2 o 6144000 byte. Puoi anche controllare il valoreTREE_MEMORY
effettivo utilizzando la tabellainformation_schema.innodb_vector_indexes
. Cloud SQL gestirà questa memoria. Non è necessario allocare spazio per tutti gli indici di vettore 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 di vettori, è necessaria memoria per elaborare un campione dei dati della tabella di base al fine di 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 la formazione è:
approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensions
Ad esempio, con una tabella di 1.000.000 righe e 768 dimensioni, il valore di
training_memory
sarà 1000000 * 0,1 * 768 * 4 o 307.200.000 byte. Per calcolare i centroidi dell'albero viene campionato solo il 10% dei dati della tabella di base.Quando attivi il flag
cloudsql_vector
, Cloud SQL imposta automaticamente un valorecloudsql_vector_max_mem_size
predefinito in base alle dimensioni della VM. Questo valore predefinito è in genere sufficiente per i carichi di lavoro tipici. Cloud SQL riduce il flaginnodb_buffer_pool_size
per 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_size
in base all'utilizzo dell'indice di vettore.Importante: se aumenti
cloudsql_vector_max_mem_size
, devi diminuire corrispondentementeinnodb_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 |
Oltre 256 GB | 16 GB |
L'intervallo di memoria dell'indice vettoriale allocato è il seguente:
- Minimo 128 MB
- 10% del pool di buffer
- Massimo 16 GB
Puoi modificare la memoria in un secondo momento, in base alle tue esigenze. Per ulteriori informazioni, consulta Attivare il flag del database per gli embedding vettoriali.
Per informazioni sul monitoraggio delle dimensioni dell'indice vettoriale, consulta Monitorare gli indici vettoriali.
Per aggiornare la memoria allocata 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 di vettore.
Questa modifica viene applicata immediatamente dopo il riavvio del database.
Creare un indice di vettori
Esistono due modi per creare un indice di vettori:
CREATE VECTOR INDEX
statement, un'estensione di Cloud SQL alla sintassi MySQL standard.- istruzione
ALTER TABLE
con l'estensione della clausolaADD VECTOR INDEX
di Cloud SQL. Non puoi eseguire questa istruzione contemporaneamente ad altre istruzioni DDL nella tabella.
Utilizza la seguente sintassi per creare un indice di vettori 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 dimensione a una representation 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 di distanza impostata nelle opzioni di ricercaapprox_distance
. I valori letterali supportati sono:L2_SQUARED
COSINE
DOT_PRODUCT
NUM_LEAVES
: facoltativo. Specifica quante partizioni (foglie) creare. Modifica questa impostazione solo se hai una buona conoscenza della ricerca ANN e del tuo set di dati. Il numero specificato non può essere superiore al numero di incorporamenti nella tabella di base.
Ad esempio, per creare un indice di vettori, esegui il seguente comando:
CREATE
VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;
Durante l'esecuzione dell'istruzione CREATE
, la tabella di base viene messa in modalità di sola lettura e non sono consentite istruzioni DML nella tabella di base.
Per creare un indice in 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 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 di vettori
Questa sezione fornisce ulteriori informazioni sui parametri utilizzati per compilare l'indice vettoriale. Per ottimizzare l'indice di vettore, utilizza queste informazioni per determinare in che modo influenzare il processo di compilazione.
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 di vettori. |
innodb_ddl_threads |
Grado di parallelismo per l'addestramento e la compilazione dell'indice. | 4 | Sessione | Valori più elevati 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.
Modifica innodb_ddl_threads
per bilanciare il tempo di compilazione e il carico della CPU, tenendo conto dell'impatto sulle operazioni del database concorrenti. Monitora l'utilizzo della CPU durante la compilazione.
Inserisci un indice di vettore
Per eliminare un indice di vettori, utilizza le istruzioni SQL DROP INDEX
o ALTER TABLE
con il nome dell'indice da eliminare, come mostrato di seguito:
DROP INDEX index_name ON books;
ALTER TABLE table_name
DROP INDEX index_name;
Monitora gli indici di vettori
Cloud SQL fornisce le seguenti tabelle dello schema delle informazioni con informazioni in tempo reale sugli indici di vettori caricati nella memoria:
information_schema.innodb_vector_indexes
elenca tutti gli indici di vettori che vengono aperti nella 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 il seguente 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
- Leggi la panoramica sulla ricerca di vettori su Cloud SQL.
- Scopri come attivare e disattivare gli embedding vettoriali nella tua istanza.
- Scopri come generare embedding vettoriali.
- Scopri come eseguire ricerche sui vector embedding.