Crea y administra índices vectoriales

En esta página, se describe cómo configurar la memoria para los índices vectoriales, y cómo crear, ajustar, supervisar y descartar índices vectoriales.

Antes de comenzar

Antes de crear un índice de vectores, debes cargar datos en la tabla base con valores de incorporación de vectores. Tu tabla base debe tener al menos 1,000 filas. Si tienes más datos disponibles, puedes obtener una mejor partición y un mejor entrenamiento del índice.

Configura la asignación de memoria para índices de vectores

La marca de base de datos cloudsql_vector_max_mem_size controla la cantidad de memoria que tu instancia de Cloud SQL dedica a los índices de vectores. Esta es una marca estática que requiere que reinicies la instancia. Esta memoria tiene dos propósitos principales:

  1. Almacenamiento de la estructura del índice de vectores: La parte no hoja del índice de vectores (el TREE_MEMORY) reside en esta memoria. El tamaño aproximado de este árbol depende de la cantidad de nodos hoja (num_leaves) y las dimensiones de tus vectores:

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Por ejemplo, un índice con 1,000 hojas y 768 dimensiones tendría un TREE_MEMORY aproximado de 1,000 * 768 * 4 * 2 o 6,144,000 bytes. También puedes verificar el TREE_MEMORY real con la tabla information_schema.innodb_vector_indexes. Cloud SQL administra esa memoria. No es necesario que asignes espacio para todos los índices vectoriales de forma simultánea, ya que los índices inactivos se descargan para dejar espacio para otras solicitudes.

  2. Memoria para la creación del índice (datos de entrenamiento): Durante la creación del índice de vectores, se necesita memoria para procesar una muestra de los datos de tu tabla base y compilar el índice. Esta memoria se usa solo durante el proceso de creación del índice y se libera después. El tamaño aproximado de la memoria necesaria para el entrenamiento es el siguiente:

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

    Por ejemplo, con una tabla de 1,000,000 de filas y 768 dimensiones, el training_memory sería 1,000,000 * 0.1 * 768 * 4 o 307,200,000 bytes. Solo se toma una muestra del 10% de los datos de la tabla base para calcular los centroides del árbol.

    Cuando habilitas la marca cloudsql_vector, Cloud SQL establece automáticamente un valor predeterminado de cloudsql_vector_max_mem_size según el tamaño de tu VM. Por lo general, este valor predeterminado es suficiente para las cargas de trabajo típicas. Cloud SQL reduce la marca innodb_buffer_pool_size para asignar esta memoria. El valor máximo predeterminado para cloudsql_vector_max_mem_size es de 16 GB. Si necesitas ajustar el tamaño de la memoria, puedes ajustar cloudsql_vector_max_mem_size de forma dinámica según el uso del índice de vectores.

    Importante: Si aumentas cloudsql_vector_max_mem_size, debes disminuir innodb_buffer_pool_size en la misma proporción para evitar problemas de memoria.

cloudsql_vector_max_mem_size valores

Tamaño de la VM cloudsql_vector_max_mem_size
4 GB 194 MB
8 GB 515 MB
16 GB 1.2 GB
32 GB 2.56 GB
64 GB 5.12 GB
128 GB 10.24 GB
Más de 256 GB 16 GB

El rango de memoria asignada al índice de vectores es el siguiente:

  • 128 MB como mínimo
  • El 10% del grupo de búferes
  • 16 GB como máximo

Puedes ajustar la memoria más adelante, según sea necesario. Para obtener más información, consulta Habilita la marca de base de datos para las incorporaciones de vectores.

Para obtener información sobre cómo supervisar el tamaño de tu índice de vectores, consulta Supervisa los índices de vectores.

Para actualizar la memoria asignada a los índices de vectores en la instancia, usa el siguiente comando:

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

Reemplaza lo siguiente:

  • INSTANCE_NAME: El nombre de la instancia en la que cambias la asignación de memoria.
  • NEW_MEMORY_VALUE: Es la asignación de memoria actualizada, en bytes, para tus índices de vectores.

Este cambio se aplica inmediatamente después de reiniciar la base de datos.

Crea un índice vectorial

Existen dos formas de crear un índice vectorial:

  • SentenciaCREATE VECTOR INDEX, una extensión de Cloud SQL para la sintaxis estándar de MySQL.
  • Instrucción ALTER TABLE con la extensión de la cláusula ADD VECTOR INDEX de Cloud SQL No puedes ejecutar esta declaración de forma simultánea con otras declaraciones DDL en la tabla.

Usa la siguiente sintaxis para crear un índice de vectores con 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>' }}];

Las siguientes son las opciones de índice:

  • USING SCANN: Opcional. Indica el tipo de índice que se usará. SCANN es el único valor admitido.
  • QUANTIZER: Opcional. Asigna un vector de alta dimensión a una representación comprimida. SQ8 es el único valor admitido.
  • DISTANCE_MEASURE: Obligatorio. Especifica una fórmula matemática para calcular la similitud de dos vectores. Debes establecer la misma medida de distancia en este parámetro que la que estableciste en las opciones de búsqueda de approx_distance. Los literales admitidos son los siguientes:
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES: Opcional. Especifica cuántas particiones (hojas) se deben crear. Solo cambia este parámetro de configuración de su valor predeterminado si comprendes bien la búsqueda de ANN y tu conjunto de datos. El número especificado no puede ser mayor que la cantidad de incorporaciones en la tabla base.

Por ejemplo, para crear un índice de vectores, ejecuta el siguiente comando:

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

Mientras se ejecuta la declaración CREATE, la tabla base se coloca en modo de solo lectura y no se permiten DML en la tabla base.

Puedes usar la siguiente sintaxis para crear un índice en una tabla existente:

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

Por ejemplo, para crear un índice en una tabla existente, haz lo siguiente:

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

Ajusta el índice de vectores

En esta sección, se brinda más información sobre los parámetros que usas para compilar el índice de vectores. Para ajustar el índice de vectores, usa esta información para determinar cómo influir en el proceso de compilación.

Parámetro Descripción Valor predeterminado Alcance Impacto
cloudsql_vector_max_mem_size Es la memoria asignada para el entrenamiento del índice. Varía Instancia Una memoria insuficiente puede provocar errores de compilación. Consulta Configura la asignación de memoria para índices de vectores.
innodb_ddl_threads Es el grado de paralelismo para el entrenamiento y la compilación del índice. 4 Sesión Los valores más altos reducen el tiempo de compilación, pero aumentan la carga de la CPU. Establece este valor en la cantidad de CPUs que puedes liberar sin afectar negativamente las operaciones de la base de datos.

Asegúrate de que cloudsql_vector_max_mem_size esté configurado correctamente para el entrenamiento. Ajusta innodb_ddl_threads para equilibrar el tiempo de compilación y la carga de la CPU, teniendo en cuenta el impacto en las operaciones simultáneas de la base de datos. Supervisa el uso de CPU durante la compilación.

Descarta un índice vectorial

Para descartar un índice vectorial, usa las instrucciones DROP INDEX o ALTER TABLE de SQL con el nombre del índice que deseas descartar, como se muestra a continuación:

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

Supervisa los índices vectoriales

Cloud SQL proporciona las siguientes tablas de INFORMATION_SCHEMA con información en tiempo real sobre los índices vectoriales que se cargan en su memoria:

  • information_schema.innodb_vector_indexes enumera todos los índices de vectores que se abren en la memoria después del reinicio.
  • information_schema.innodb_all_vector_indexes enumera todos los índices vectoriales que existen en la instancia (incluso si aún no se abrieron en la memoria).
  • information_schema.innodb_vector_indexes_memory proporciona información sobre el uso general de la memoria de los índices vectoriales en la instancia.

Para obtener información más detallada, consulta el esquema de información.

Para ver la información en la tabla innodb_vector_indexes, ejecuta el siguiente comando:

SELECT * FROM information_schema.innodb_vector_indexes \ G;

El resultado es similar al siguiente:

 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

¿Qué sigue?