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 los índices vectoriales

La marca de base de datos cloudsql_vector_max_mem_size controla cuánta memoria dedica tu instancia de Cloud SQL 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 vectorial: La parte no hoja del índice vectorial (el TREE_MEMORY) reside en esta memoria. El tamaño aproximado de este árbol depende de la cantidad de nodos de hoja (num_leaves) y de 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 simultáneamente, ya que los índices inactivos se descargan para dejar espacio para otras solicitudes.

  2. Memoria para la creación de índices (datos de entrenamiento): Durante la creación del índice vectorial, se necesita memoria para procesar una muestra de los datos de tu tabla base y compilar 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 el siguiente:

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

    Por ejemplo, con una tabla de 1,000,000 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 configura automáticamente un cloudsql_vector_max_mem_size predeterminado en función del 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 de manera proporcional 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 del índice vectorial asignado 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 vectoriales.

Para obtener información sobre cómo supervisar el tamaño del índice vectorial, consulta Supervisa los índices vectoriales.

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: Es el nombre de la instancia en la que cambias la asignación de memoria.
  • NEW_MEMORY_VALUE: La asignación de memoria actualizada, en bytes, para tus índices de vectores

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

Crea un índice vectorial

Existen dos maneras de crear un índice vectorial:

  • Sentencia CREATE VECTOR INDEX, una extensión de Cloud SQL a la sintaxis estándar de MySQL
  • Sentencia ALTER TABLE con la extensión de cláusula ADD VECTOR INDEX de Cloud SQL. No puedes ejecutar esta sentencia de forma simultánea con otras sentencias 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>' }}];

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 que se usará 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 compilar. Solo cambia este parámetro de configuración 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 la cantidad de incorporaciones en la tabla base.

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

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

Mientras se ejecuta la sentencia CREATE, la tabla base se coloca en un modo de solo lectura y no se permiten DML en ella.

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, sigue estos pasos:

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

Ajusta el índice vectorial

En esta sección, se proporciona 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 La memoria insuficiente puede provocar fallas de compilación. Consulta Configura la asignación de memoria para los índices de vectores.
innodb_ddl_threads Grado de paralelismo para el entrenamiento y la compilación de índices. 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 reservar 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.

Cómo descartar 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 esquema de información con información en tiempo real sobre los índices de vectores que se cargan en su memoria:

  • information_schema.innodb_vector_indexes enumera todos los índices vectoriales que se abren en la memoria después del reinicio.
  • information_schema.innodb_all_vector_indexes enumera todos los índices de vectores 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 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 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

¿Qué sigue?