Créer et gérer des index vectoriels

Cette page explique comment configurer la mémoire pour les index vectoriels, et comment créer, ajuster, surveiller et supprimer des index vectoriels.

Avant de commencer

Avant de créer un indice vectoriel, vous devez charger des données dans la table de base avec des valeurs d'encapsulation vectorielle. Votre table de base doit contenir au moins 1 000 lignes. Si vous avez davantage de points de données disponibles, vous pouvez obtenir un meilleur partitionnement et un meilleur entraînement de l'index.

Configurer l'allocation de mémoire pour les index vectoriels

L'indicateur de base de données cloudsql_vector_max_mem_size contrôle la quantité de mémoire que votre instance Cloud SQL consacre aux index vectoriels. Il s'agit d'un indicateur statique qui nécessite un redémarrage de votre instance. Cette mémoire a deux fonctions principales:

  1. Stockage de la structure de l'index vectoriel:la partie non feuille de l'index vectoriel (TREE_MEMORY) se trouve dans cette mémoire. La taille approximative de cet arbre dépend du nombre de nœuds de feuille (num_leaves) et des dimensions de vos vecteurs:

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Par exemple, un indice avec 1 000 feuilles et 768 dimensions aurait une valeur TREE_MEMORY approximative de 1 000 x 768 x 4 x 2, soit 6 144 000 octets. Vous pouvez également vérifier l'TREE_MEMORY réelle à l'aide du tableau information_schema.innodb_vector_indexes. Cloud SQL gère cette mémoire. Vous n'avez pas besoin d'allouer de l'espace pour tous les index vectoriels simultanément, car les index inactifs sont déchargés pour libérer de l'espace pour d'autres requêtes.

  2. Mémoire pour la création d'index (données d'entraînement) : lors de la création d'un indice vectoriel, de la mémoire est nécessaire pour traiter un échantillon des données de votre table de base afin de créer l'index. Cette mémoire n'est utilisée que pendant le processus de création de l'index et est libérée par la suite. La taille approximative de la mémoire nécessaire à l'entraînement est la suivante:

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

    Par exemple, avec une table de 1 000 000 lignes et 768 dimensions, training_memory sera de 1 000 000 * 0,1 * 768 * 4, soit 307 200 000 octets. Seuls 10% des données de la table de base sont échantillonnés pour calculer les centroïdes de l'arborescence.

    Lorsque vous activez l'indicateur cloudsql_vector, Cloud SQL définit automatiquement un cloudsql_vector_max_mem_size par défaut en fonction de la taille de votre VM. Cette valeur par défaut est généralement suffisante pour les charges de travail standards. Cloud SQL réduit l'indicateur innodb_buffer_pool_size pour allouer cette mémoire. La valeur maximale par défaut pour cloudsql_vector_max_mem_size est de 16 Go. Si vous devez ajuster la taille de votre mémoire, vous pouvez ajuster dynamiquement cloudsql_vector_max_mem_size en fonction de votre utilisation de l'index vectoriel.

    Important: Si vous augmentez cloudsql_vector_max_mem_size, vous devez réduire innodb_buffer_pool_size en conséquence pour éviter les problèmes de mémoire.

cloudsql_vector_max_mem_size valeurs

Taille de la VM cloudsql_vector_max_mem_size
4GB 194 Mo
8 Go 515 Mo
16 Go 1,2 Go
32 Go 2,56 Go
64 Go 5,12 Go
128 Go 10,24 Go
256 Go ou plus 16 Go

La plage de mémoire allouée à l'index vectoriel est la suivante:

  • 128 Mo minimum
  • 10% du pool de mémoire tampon
  • 16 Go maximum

Vous pourrez ajuster la mémoire plus tard, si nécessaire. Pour en savoir plus, consultez la section Activer l'indicateur de base de données pour les embeddings vectoriels.

Pour en savoir plus sur la surveillance de la taille de votre index vectoriel, consultez la page Surveiller les index vectoriels.

Pour mettre à jour la mémoire allouée aux index vectoriels sur l'instance, utilisez la commande suivante:

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

Remplacez les éléments suivants :

  • INSTANCE_NAME: nom de l'instance sur laquelle vous modifiez l'allocation de mémoire.
  • NEW_MEMORY_VALUE: allocation de mémoire mise à jour, en octets, pour vos index vectoriels.

Cette modification prend effet immédiatement après le redémarrage de la base de données.

Créer un index vectoriel

Il existe deux façons de créer un indice vectoriel:

  • Instruction CREATE VECTOR INDEX, une extension Cloud SQL de la syntaxe MySQL standard.
  • Instruction ALTER TABLE avec l'extension de la clause ADD VECTOR INDEX de Cloud SQL. Vous ne pouvez pas exécuter cette instruction simultanément avec d'autres instructions LDD sur la table.

Pour créer un indice vectoriel à l'aide de CREATE VECTOR INDEX, utilisez la syntaxe suivante:

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>' }}];

Voici les options d'indexation:

  • USING SCANN: facultatif. Indique le type d'index à utiliser. SCANN est la seule valeur acceptée.
  • QUANTIZER: facultatif. Mappe un vecteur à haute dimension à une représentation compressée. SQ8 est la seule valeur acceptée.
  • DISTANCE_MEASURE: obligatoire. Spécifie une formule mathématique à utiliser pour calculer la similarité de deux vecteurs. Vous devez définir la même mesure de distance dans ce paramètre que celle que vous avez définie dans les options de recherche approx_distance. Voici les littéraux acceptés :
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES: facultatif. Spécifie le nombre de partitions (feuilles) à créer. Ne modifiez ce paramètre que si vous avez une bonne compréhension de la recherche ANN et de votre ensemble de données. Le nombre spécifié ne peut pas être supérieur au nombre d'embeddings dans la table de base.

Par exemple, pour créer un indice vectoriel, exécutez la commande suivante:

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

Pendant l'exécution de l'instruction CREATE, la table de base est mise en mode lecture seule et aucune opération LMD n'est autorisée sur la table de base.

Vous pouvez utiliser la syntaxe suivante pour créer un indice sur une table existante:

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

Par exemple, pour créer un index sur une table existante:

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

Régler l'index vectoriel

Cette section fournit des informations supplémentaires sur les paramètres que vous utilisez pour créer l'index de vecteur. Pour ajuster l'index vectoriel, utilisez ces informations pour déterminer comment influencer le processus de compilation.

Paramètre Description Par défaut Scope (Portée) Impact
cloudsql_vector_max_mem_size Mémoire allouée pour l'entraînement de l'index. Variable Instance Une mémoire insuffisante peut entraîner des échecs de compilation. Consultez la section Configurer l'allocation de mémoire pour les index vectoriels.
innodb_ddl_threads Degré de parallélisme pour l'entraînement et la création d'index. 4 Session Des valeurs plus élevées réduisent le temps de compilation, mais augmentent la charge du processeur. Définissez cette valeur sur le nombre de processeurs que vous pouvez économiser sans nuire aux opérations de la base de données.

Assurez-vous que cloudsql_vector_max_mem_size est correctement configuré pour l'entraînement. Ajustez innodb_ddl_threads pour équilibrer le temps de compilation et la charge du processeur, en tenant compte de l'impact sur les opérations de base de données simultanées. Surveillez l'utilisation du processeur pendant la compilation.

Supprimer un index vectoriel

Pour supprimer un indice vectoriel, utilisez les instructions SQL DROP INDEX ou ALTER TABLE avec le nom de l'index que vous souhaitez supprimer, comme indiqué ci-dessous:

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

Surveiller les index vectoriels

Cloud SQL fournit les tables de schéma d'informations suivantes avec des informations en temps réel sur les index vectoriels chargés dans sa mémoire:

  • information_schema.innodb_vector_indexes liste tous les index vectoriels ouverts dans la mémoire après le redémarrage.
  • information_schema.innodb_all_vector_indexes liste tous les index de vecteurs qui existent sur l'instance (même s'ils ne sont pas encore ouverts dans la mémoire).
  • information_schema.innodb_vector_indexes_memory fournit des informations sur l'utilisation globale de la mémoire des index vectoriels dans l'instance.

Pour en savoir plus, consultez le schéma d'informations.

Pour afficher les informations de la table innodb_vector_indexes, exécutez la commande suivante:

SELECT * FROM information_schema.innodb_vector_indexes \ G;

La sortie ressemble à ceci :

 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

Étape suivante