Crear y gestionar índices vectoriales

En esta página se describe cómo configurar la memoria de los índices vectoriales y cómo crear, optimizar, monitorizar y eliminar índices vectoriales.

Antes de empezar

Antes de crear un índice vectorial, debe cargar datos en la tabla base con valores de inserción vectorial. Tu tabla base debe tener al menos 1000 filas. Si tienes más puntos de datos disponibles, puedes conseguir una mejor partición y entrenamiento del índice.

Configurar la asignación de memoria para índices vectoriales

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 vectoriales. Se trata de una marca estática que requiere que reinicies la instancia. Esta memoria tiene dos finalidades principales:

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

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Por ejemplo, un índice con 1000 hojas y 768 dimensiones tendría un TREE_MEMORY aproximado de 1000 × 768 × 4 × 2, es decir, 6.144.000 bytes. También puedes consultar el TREE_MEMORY real en la tabla information_schema.innodb_vector_indexes. Cloud SQL gestiona esa memoria. No es necesario asignar espacio para todos los índices vectoriales simultáneamente, ya que los índices inactivos se descargan para dejar espacio a otras solicitudes.

  2. Memoria para la creación del índice (datos de entrenamiento): durante la creación del índice vectorial, se necesita memoria para procesar una muestra de los datos de la tabla base y crear el índice. Esta memoria solo se usa 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:

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

    Por ejemplo, en una tabla con 1.000.000 de filas y 768 dimensiones, el valor de training_memory sería 1.000.000 × 0,1 × 768 × 4, es decir, 307.200.000 bytes. Solo se muestrea el 10% de los datos de la tabla base para calcular los centroides del árbol.

    Cuando habilitas la marca cloudsql_vector, Cloud SQL asigna automáticamente un valor cloudsql_vector_max_mem_size predeterminado en función del tamaño de tu VM. Este valor predeterminado suele ser suficiente para las cargas de trabajo habituales. Cloud SQL reduce la marca innodb_buffer_pool_size para asignar esta memoria. El valor máximo predeterminado de cloudsql_vector_max_mem_size es de 16 GB. Si necesitas ajustar el tamaño de la memoria, puedes modificar dinámicamente cloudsql_vector_max_mem_size en función del uso del índice de vectores.

    Importante: Si aumentas cloudsql_vector_max_mem_size, debes reducir 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
256 GB o más 16 GB

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

  • 128 MB como mínimo
  • 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 Habilitar la marca de base de datos para las inserciones de vectores.

Para obtener información sobre cómo monitorizar el tamaño de tu índice vectorial, consulta Monitorizar índices vectoriales.

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

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

Haz los cambios siguientes:

  • INSTANCE_NAME: el nombre de la instancia en la que vas a cambiar la asignación de memoria.
  • NEW_MEMORY_VALUE: la asignación de memoria actualizada, en bytes, de tus índices vectoriales.

Este cambio se aplicará de inmediato después de reiniciar la base de datos.

Crear un índice vectorial

Hay dos formas de crear un índice vectorial:

  • CREATE VECTOR INDEXstatement, una extensión de Cloud SQL de la sintaxis estándar de MySQL.
  • ALTER TABLE con la extensión de la cláusula ADD VECTOR INDEX de Cloud SQL. No puedes ejecutar esta instrucción simultáneamente con otras instrucciones DDL en la tabla.

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

Estas son las opciones de índice:

  • USING SCANN: opcional. Indica el tipo de índice que se va a 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 que se usará para calcular la similitud de dos vectores. En este parámetro, debe definir la misma unidad de medida de distancia que en las approx_distanceopciones de búsqueda. Los literales admitidos son los siguientes:
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES: opcional. Especifica cuántas particiones (hojas) se van a crear. Solo debes cambiar este ajuste de su valor predeterminado si conoces bien la búsqueda de ANN y tu conjunto de datos. El número especificado no puede ser mayor que el número de inserciones de la tabla base.

Por ejemplo, para crear un índice vectorial, ejecuta lo siguiente:

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

Mientras se ejecuta la instrucción CREATE, la tabla base se pone en modo de solo lectura y no se permiten DMLs en la tabla base.

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

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

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

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

Ajustar el índice vectorial

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

Parámetro Descripción Predeterminado Ámbito Impacto
cloudsql_vector_max_mem_size Memoria asignada para el entrenamiento de índices. Varía Instancia Si no hay suficiente memoria, se pueden producir fallos en la compilación. Consulta Configurar la asignación de memoria para índices vectoriales.
innodb_ddl_threads Grado de paralelismo para el entrenamiento y la compilación de índices. 4 Sesión Cuanto más altos sean los valores, menos tiempo se tardará en compilar, pero aumentará la carga de la CPU. Asigna a este valor el número de CPUs que puedas dedicar sin que afecte negativamente a 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 de bases de datos simultáneas. Monitoriza el uso de la CPU durante la compilación.

Eliminar un índice vectorial

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

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

Monitorizar índices vectoriales

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

  • information_schema.innodb_vector_indexes muestra todos los índices vectoriales que se abren en la memoria después de reiniciar.
  • information_schema.innodb_all_vector_indexes muestra todos los índices vectoriales que hay en la instancia (aunque aún no se hayan abierto en la memoria).
  • information_schema.innodb_vector_indexes_memory proporciona información sobre el uso general de la memoria de los índices vectoriales de la instancia.

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

Para ver la información de 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

Siguientes pasos