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 index vectoriel, vous devez charger des données dans la table de base avec des valeurs d'embedding vectoriel. Votre table de base doit contenir au moins 1 000 lignes. Si vous avez davantage de points de données disponibles, vous pouvez améliorer le partitionnement et l'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 le redémarrage de votre instance. Ce souvenir a deux objectifs principaux :

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

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Par exemple, un index 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 le TREE_MEMORY réel à l'aide de la table 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 faire de la place aux autres requêtes.

  2. Mémoire pour la création d'index (données d'entraînement) : lors de la création d'un index 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 pour l'entraînement est la suivante :

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

    Par exemple, avec un tableau de 1 000 000 de lignes et 768 dimensions, le training_memory serait de 1 000 000 * 0,1 * 768 * 4, soit 307 200 000 octets. Seules 10 % des données de la table de base sont échantillonnées pour calculer les centroïdes de l'arbre.

    Lorsque vous activez l'indicateur cloudsql_vector, Cloud SQL définit automatiquement une valeur cloudsql_vector_max_mem_size par défaut en fonction de la taille de votre VM. Cette valeur par défaut suffit généralement pour les charges de travail classiques. 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 modifier 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 diminuer 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 Activer l'option de base de données pour les embeddings vectoriels.

Pour en savoir plus sur la surveillance de la taille de votre index vectoriel, consultez 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 index vectoriel :

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

Utilisez la syntaxe suivante pour créer un index vectoriel à l'aide de 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>' }}];

Voici les options d'index :

  • USING SCANN : facultatif. Indique le type d'index à utiliser. SCANN est la seule valeur acceptée.
  • QUANTIZER : facultatif. Mappe un vecteur de grande 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. Les littéraux acceptés sont les suivants :
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES : facultatif. Indique le nombre de partitions (feuilles) à créer. Ne modifiez ce paramètre par défaut que si vous comprenez bien la recherche ANN et votre ensemble de données. Le nombre spécifié ne peut pas être supérieur au nombre d'intégrations dans la table de base.

Par exemple, pour créer un index 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 index 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 vectoriel. 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 à l'entraînement de l'index. Variable Instance Une mémoire insuffisante peut entraîner des échecs de compilation. Consultez 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 épargner sans affecter négativement les opérations de 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 index 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 en mémoire après le redémarrage.
  • information_schema.innodb_all_vector_indexes liste tous les index vectoriels qui existent sur l'instance (même s'ils ne sont pas encore ouverts en 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 des informations dans le tableau 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

Étapes suivantes