En esta página se explica cómo puedes interactuar con Cloud SQL para crear aplicaciones que usen inserciones vectoriales.
Cloud SQL para MySQL admite el almacenamiento de inserciones vectoriales. Después, puedes crear índices de búsqueda de vectores y realizar búsquedas de similitud en estos embeddings de vectores junto con el resto de los datos que almacenes en Cloud SQL.
Almacenamiento de incrustaciones de vectores
Puedes usar Cloud SQL para MySQL para almacenar inserciones de vectores creando una columna de inserción de vectores en una tabla. La columna de inserción de vector especial se asigna al tipo de datos VARBINARY
. Al igual que otros datos relacionales de la tabla, puedes acceder a las incrustaciones de vectores de la tabla con las garantías de transacción que ya tienes. Una tabla que tiene una columna de inserción de vector es una tabla InnoDB normal y, por lo tanto, cumple las propiedades de atomicidad, coherencia, aislamiento y durabilidad (ACID). Las propiedades ACID solo se desvían en las búsquedas de índices de búsqueda vectorial.
Ten en cuenta lo siguiente al configurar una tabla para las inserciones vectoriales:
Puede crear un máximo de una columna de inserción de vector en una tabla y un índice de búsqueda de vector por tabla. Cada inserción de vector almacenada en la misma columna debe tener exactamente las mismas dimensiones que especificó al definir la columna. Una inserción vectorial tiene un límite máximo de 16.000 dimensiones. Si tienes suficiente almacenamiento y memoria disponibles, puedes tener tablas independientes con diferentes columnas de inserción de vectores e índices de búsqueda de vectores en la misma instancia.
Aunque no hay un límite estricto en cuanto al número de incrustaciones de vectores que puedes almacenar en una tabla, los índices de búsqueda de vectores requieren memoria. Por este motivo, le recomendamos que no almacene más de 10 millones de inserciones de vectores en una tabla.
Consulta también la lista de limitaciones.
La replicación funciona de la misma forma en la columna de incrustación de vectores que en otras columnas de InnoDB de MySQL.
Búsqueda por similitud
Cloud SQL admite la búsqueda de similitud mediante consultas de vecinos más cercanos (KNN) y de vecinos más cercanos aproximados (ANN). Puedes usar ambos tipos de búsquedas de vectores en tus instancias de Cloud SQL. Solo puedes crear un índice de búsqueda vectorial para búsquedas de ANN.
Búsqueda de los k vecinos más cercanos (KNN)
Cloud SQL admite consultas mediante la búsqueda vectorial KNN, también denominada búsqueda de vecinos más cercanos exactos. Al realizar una búsqueda de vectores KNN, se obtiene una recuperación perfecta. Puedes realizar búsquedas de vecinos más cercanos sin tener que crear un índice de búsqueda de vectores. La búsqueda de vecinos más cercanos se basa en la ejecución de un algoritmo de análisis de tabla.
En el caso de la búsqueda de k-NN, Cloud SQL también admite las siguientes funciones de búsqueda de distancia de vectores:
- Coseno
- Producto escalar
- Distancia al cuadrado L2
Para obtener más información sobre cómo usar las funciones de distancia de búsqueda vectorial, consulta Consultar la distancia de una incrustación vectorial.
Búsqueda del vecino más cercano aproximado (ANN)
Cloud SQL permite crear y consultar búsquedas de ANN mediante la creación de índices de búsqueda de vectores. Un índice de búsqueda vectorial de ANN te permite optimizar el rendimiento en lugar de la recuperación perfecta. En el caso de la búsqueda de ANN, Cloud SQL admite los siguientes tipos de índice:
BRUTE_FORCE
: el tipo de índice de búsqueda vectorial predeterminado de una tabla base que tiene menos de 10.000 filas. Este tipo es el más adecuado para búsquedas en un subconjunto más pequeño de un conjunto de datos original. La memoria utilizada por el índice es igual al tamaño del conjunto de datos. Este tipo de índice no se conserva en el disco.TREE_SQ
: el tipo de índice de búsqueda vectorial predeterminado de una tabla base que tiene 10.000 filas o más. Este tipo usa la menor cantidad de memoria o aproximadamente el 25% del tamaño del conjunto de datos. Los índicesTREE_SQ
se conservan en el disco.TREE_AH
: un tipo de índice de búsqueda vectorial que proporciona un algoritmo de búsqueda de hash asimétrico. Tal como se implementa en Cloud SQL, este tipo de índice no está optimizado para la huella de memoria y no se conserva.
Actualizar índices de búsqueda vectorial
Cloud SQL para MySQL actualiza los índices de búsqueda de vectores en tiempo real. Cualquier transacción que realice operaciones del lenguaje de manipulación de datos (DML) en la tabla base también propaga los cambios a los índices de búsqueda vectorial asociados. Los cambios en un índice de búsqueda vectorial se muestran inmediatamente en todas las demás transacciones, lo que significa que el nivel de aislamiento es READ_UNCOMMITTED
.
Si revierte una transacción, los cambios de reversión correspondientes también se producen en el índice de búsqueda vectorial.
Replicación de índices de búsqueda vectorial
Cloud SQL para MySQL replica los índices de búsqueda de vectores en todas las réplicas de lectura. No se admiten filtros de replicación ni la replicación de índices de búsqueda de vectores en réplicas en cascada.
Configurar una instancia para que admita incrustaciones de vectores
En esta sección se describe cómo configurar tu instancia de Cloud SQL para que admita el almacenamiento, la indexación y las consultas de inserciones vectoriales.
Las instancias de las ediciones Enterprise y Enterprise Plus de Cloud SQL admiten inserciones vectoriales.
Antes de empezar
- Tu instancia debe ejecutar Cloud SQL para MySQL MySQL versión
8.0.36.R20240401.03_00
o posterior. - Tu instancia debe tener suficiente espacio en disco para asignar memoria para el número total de inserciones de vectores de la instancia.
Habilitar las inserciones de vectores
Para activar la compatibilidad con las inserciones de vectores, debes configurar las marcas de la base de datos MySQL.
gcloud sql instances patch INSTANCE_NAME \ --database-flags=FLAGS
Sustituye INSTANCE_NAME por el nombre de la instancia en la que quieras habilitar la compatibilidad con la inserción de vectores.
En FLAGS, configura las siguientes marcas de MySQL en tu instancia:
cloudsql_vector
: define esta marca enon
para habilitar el almacenamiento de inserciones de vectores y la compatibilidad con la búsqueda. Puedes crear columnas de inserciones vectoriales e índices de búsqueda vectorial en la instancia.cloudsql_vector_max_mem_size
: opcional. Especifica la asignación de memoria máxima en bytes para todos los índices de búsqueda vectorial de la instancia. Si no especificas esta marca, la asignación de memoria predeterminada será de 1 GB, que es la asignación de memoria mínima. Para obtener más información sobre cómo calcular la cantidad que debe especificar, consulte Configurar la asignación de memoria para índices de búsqueda de vectores.Esta memoria dedicada procede de la memoria asignada a tu
innodb_buffer_pool_size
. El tamaño del grupo de búferes disponible se reduce en la misma cantidad. El valor máximo permitido de esta marca es el 50% de tuinnodb_buffer_pool_size
total.Si especifica un valor superior al 50% de su
innodb_buffer_pool_size
total, Cloud SQL reduce el valor efectivo al 50% del tamaño disponible y registra un mensaje de advertencia para la instancia.
Después de configurar las marcas, el comando puede tener un aspecto similar al siguiente:
gcloud sql instances patch my-instance \ --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296
Las marcas para configurar la compatibilidad con inserciones vectoriales en Cloud SQL para MySQL son estáticas. Después de actualizar la instancia con las marcas, esta se reiniciará automáticamente para que los cambios de configuración surtan efecto.
Para obtener más información sobre cómo configurar marcas de bases de datos para MySQL, consulta el artículo Configurar marcas de bases de datos.
Inhabilitar incrustaciones de vectores
Para inhabilitar las inserciones de vectores, asigna el valor off
a la marca cloudsql_vector
.
Por ejemplo:
gcloud sql instances patch INSTANCE_NAME \ --database-flags=cloudsql_vector=off
Sustituye INSTANCE_NAME por el nombre de la instancia en la que vas a desactivar la compatibilidad con la inserción de vectores.
Si asignas el valor cloudsql_vector
a off
, no podrás crear columnas de inserción de vectores ni índices de búsqueda de vectores. Después de configurar este flag estático, la instancia se reiniciará automáticamente para que el cambio de configuración surta efecto.
Después de reiniciar la instancia, Cloud SQL para MySQL hace lo siguiente:
- Elimina todos los índices de búsqueda de vectores
TREE_SQ
persistentes del disco persistente. - Mantiene las entradas de la tabla del diccionario de datos de los índices de búsqueda vectorial que se han creado. Sin embargo, Cloud SQL para MySQL no reconstruye los índices y las consultas de búsqueda a estos índices devuelven un error.
- Sigue almacenando las incrustaciones de vectores en las tablas base. Los vector embeddings siguen estando accesibles.
Si más adelante vuelves a habilitar la marca cloudsql_vector
en la instancia, Cloud SQL intentará volver a generar los índices mientras se reinicia la instancia en función de las entradas de la tabla del diccionario de datos.
Configuración de réplicas de lectura
Si la instancia cumple los criterios de versión de mantenimiento y habilitación de la marca, Cloud SQL admite totalmente las inserciones de vectores en una réplica de lectura.
Si creas una réplica a partir de una instancia principal que tenga habilitada la compatibilidad con la incrustación de vectores, la réplica de lectura heredará los ajustes de compatibilidad con la incrustación de vectores de la instancia principal. Debes habilitar la compatibilidad con la inserción de vectores de forma individual en las instancias de réplica de lectura que ya tengas.
En cuanto al impacto en el retraso de la replicación, la creación y el mantenimiento de los índices de búsqueda vectorial funcionan de la misma forma que los índices de MySQL normales.
Los índices de búsqueda vectorial no se admiten en réplicas en cascada.
Ejemplo: un índice y una consulta de búsqueda de vectores ANN
En el siguiente ejemplo, se explica cómo crear un índice de búsqueda de vectores basado en ANN y cómo hacer una consulta en Cloud SQL.
Generar incrustaciones de vectores. Puedes crear inserciones vectoriales manualmente o usar la API de inserciones de texto que prefieras. Para ver un ejemplo que usa Vertex AI, consulta Generar inserciones de vectores basadas en datos de filas.
Crea una tabla en Cloud SQL para MySQL que contenga una columna de inserciones de vectores con tres dimensiones.
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY );
Inserta una inserción de vector en la columna.
INSERT INTO books VALUES ( 1, 'book title', string_to_vector('[1,2,3]') );
Confirma los cambios.
commit;
Crea el índice de búsqueda vectorial. Si vas a crear un índice
TREE_SQ
oTREE_AH
, la tabla debe tener al menos 1000 filas.CALL mysql.create_vector_index('vectorIndex', 'dbname.books', 'embedding', 'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED' );
Obtiene los vecinos más cercanos.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Generar incrustaciones de vectores a partir de datos de filas
Puedes generar una inserción de vector para los datos de una fila determinada mediante una API de inserción de texto, como Vertex AI o OpenAI. Puedes usar cualquier API de incrustaciones de texto con las incrustaciones de vectores de Cloud SQL. Sin embargo, debes usar la misma API de inserciones de texto para generar el vector de la cadena de consulta. No puedes combinar diferentes APIs para los datos de origen y la vectorización de consultas.
Por ejemplo, puedes generar una incrustación vectorial desde Vertex AI:
from vertexai.language_models import TextEmbeddingModel
def text_embedding() -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("text-embedding-004")
embeddings = model.get_embeddings(["What is life?"])
for embedding in embeddings:
vector = embedding.values
print(f"Length of Embedding Vector: {len(vector)}")
return vector
if __name__ == "__main__":
text_embedding()
Almacenar incrustaciones de vectores
En esta sección se proporcionan ejemplos de instrucciones para almacenar inserciones vectoriales en Cloud SQL.
Crear una tabla con una columna de inserción de vector
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Añadir una columna de inserciones vectoriales a una tabla
ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;
Insertar una incrustación de vector
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')
);
Insertar varias incrustaciones de vectores
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')),
('book title', string_to_vector('[4,5,6]')
);
Insertar o actualizar una incrustación de vector
INSERT INTO books (
id,
title,
embedding
) VALUES (
1,
'book title',
string_to_vector('[1,2,3]')
)
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');
Actualizar una incrustación de vector
UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;
Eliminar una incrustación de vector
DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');
Trabajar con índices de búsqueda vectorial
De forma predeterminada, puedes realizar la búsqueda del vecino más cercano exacto, que proporciona la recuperación perfecta. También puedes añadir un índice para usar la búsqueda de ANN, que intercambia recuperación por velocidad. A diferencia de los índices típicos, después de añadir un índice aproximado, verás resultados diferentes para las consultas.
Recomendaciones
En esta sección se describen las prácticas recomendadas para trabajar con índices de búsqueda vectorial. Cada carga de trabajo es diferente, por lo que es posible que tengas que hacer ajustes.
- Antes de crear un índice de búsqueda vectorial, debes cargar datos en la tabla. Tu tabla base debe tener al menos 1000 filas. Estos requisitos solo se aplican a los tipos de índice de búsqueda
TREE_SQ
yTREE_AH
. Si tienes más puntos de datos disponibles, tendrás una mejor partición y entrenamiento del índice. - Monitoriza el uso de memoria de los índices. Si la instancia se queda sin memoria, no podrás crear ni compilar ningún índice. En el caso de los índices que ya existen, cuando se alcanza el umbral, Cloud SQL escribe periódicamente advertencias en el registro de errores de MySQL. Puedes ver el uso de memoria en la tabla
information_schema.innodb_vector_indexes
. - Si la tabla base subyacente ha sufrido cambios importantes en el lenguaje de manipulación de datos, vuelve a compilar los índices de búsqueda de vectores. Para obtener el tamaño inicial del índice en tiempo de compilación y el tamaño actual del índice, consulta la tabla
information_schema.innodb_vector_indexes
. - Por lo general, se puede dejar que el número de particiones se calcule internamente. Si quieres especificar el número de particiones, debes tener al menos 100 puntos de datos por partición.
Tabla base de solo lectura durante las operaciones de índice de búsqueda vectorial
Durante las tres operaciones del índice de búsqueda vectorial (crear, modificar y eliminar), la tabla base se pone en modo de solo lectura. Durante estas operaciones, no se permiten DMLs en la tabla base.
Persistencia, cierre e impacto en el mantenimiento
Solo los índices de búsqueda vectorial que usan el tipo TREE_SQ
se conservan en el disco cuando se cierra una instancia de forma correcta.
Los índices de búsqueda vectorial que usan los tipos TREE_AH
y BRUTE_FORCE
solo se almacenan en la memoria.
Después de un cierre limpio de una instancia, Cloud SQL vuelve a cargar los índices de búsqueda de vectores cuando se reinicia la instancia. Sin embargo, después de un fallo o un apagado incorrecto, Cloud SQL debe volver a generar los índices de búsqueda de vectores. Por ejemplo, cada vez que tu instancia sufra un fallo y se recupere mediante una copia de seguridad y una restauración, una recuperación a un momento dado o una conmutación por error de alta disponibilidad, Cloud SQL volverá a compilar tus índices de búsqueda vectorial. En estos casos, ocurre lo siguiente:
- La recompilación se realiza automáticamente en segundo plano.
- Durante la reconstrucción, la tabla base está en modo de solo lectura.
- Si la recompilación automática no puede bloquear la tabla en un periodo de tiempo específico, se produce un error. Es posible que tengas que volver a crear el índice manualmente.
El tiempo necesario para reconstruir un índice puede aumentar el tiempo necesario para apagar una instancia, lo que también puede aumentar el tiempo de mantenimiento y actualización necesario para una instancia.
Configurar la asignación de memoria para los índices de Vector Search
Cloud SQL crea y mantiene índices de búsqueda de vectores en la memoria. El tipo de índice TREE_SQ
se mantiene en un cierre limpio y se vuelve a cargar después de que se reinicie la instancia. Durante el tiempo de ejecución, todos los índices de búsqueda vectorial deben permanecer en la memoria.
Para asegurarse de que Cloud SQL tiene suficiente memoria disponible para mantener todos los índices de búsqueda vectorial en la memoria, configure la instancia de Cloud SQL con una cloudsql_vector_max_mem_size
. cloudsql_vector_max_mem_size
determina la cantidad de memoria que la instancia de Cloud SQL dedica a los índices de búsqueda vectorial. Cuando configures el valor de la marca, ten en cuenta lo siguiente:
- El valor predeterminado y mínimo es 1 GB. El límite superior es el 50% del tamaño del pool de búferes.
- Después de definir esta marca, la instancia se reiniciará automáticamente para que se aplique el cambio de configuración.
- Si tu instancia ha agotado toda la memoria configurada, no podrás crear ni modificar ningún índice de búsqueda de vectores.
Para actualizar la memoria asignada a los índices de búsqueda vectorial de la instancia, cambia el valor de la marca cloudsql_vector_max_mem_size
.
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 de búsqueda vectorial.
Este cambio reinicia la instancia automáticamente para que se aplique.
Calcular la memoria necesaria
La cantidad de memoria que requiere un índice depende del tipo de índice, del número de inserciones de vectores y de la dimensionalidad de las inserciones. Hay dos requisitos de memoria que debes tener en cuenta:
- Memoria de tiempo de compilación: la memoria necesaria durante la compilación del índice.
- Memoria del índice: la memoria que ocupa el índice después de crearse.
En un índice determinado, el tamaño del conjunto de datos es la memoria necesaria para leer todas las incrustaciones de vectores en la memoria. Dado que cada dimensión se representa mediante un número de coma flotante que usa 4 bytes de memoria, puede determinar el tamaño del conjunto de datos de la siguiente manera:
dataset_size = <num_embeddings> * (4 * <dimensions>)
Por ejemplo, si tienes un millón de inserciones de 768 dimensiones, tu dataset_size
será de 3 GB.
Según el ejemplo anterior, los requisitos de memoria de los diferentes tipos de índice son los siguientes:
Tipo de índice | Memoria de tiempo de compilación | Memoria de índice |
---|---|---|
TREE_SQ |
4 GB | 1 GB |
TREE_AH
|
3,5 GB | 3,5 GB |
BRUTE_FORCE
|
3 GB | 3 GB |
Si usas TREE_SQ
índices de búsqueda de vectores, también debes tener en cuenta la memoria necesaria para la persistencia en el tiempo de ejecución. A la cantidad total de memoria de tu configuración, añade la cantidad de memoria de índice que usa el índice de búsqueda de vectores TREE_SQ
activo más grande.
Cada vez que se realizan operaciones de DML en la tabla base en la que se almacenan las incrustaciones de vectores, el índice de búsqueda de vectores se actualiza en tiempo real. Estos cambios modifican el espacio de memoria del índice, que puede reducirse o ampliarse en función de la operación DML. Puedes monitorizar el espacio de memoria de un índice consultando la tabla information_schema.innodb_vector_indexes
. Para obtener información sobre cómo monitorizar el tamaño de tu índice de búsqueda vectorial, consulta Monitorizar índices de búsqueda vectorial.
Crear un índice de búsqueda vectorial
La instrucción para crear un índice de búsqueda vectorial utiliza la siguiente sintaxis:
CALL mysql.create_vector_index('INDEX_NAME', 'DB_NAME.TABLE_NAME', 'COLUMN_NAME', 'PARAMETERS' );
Por ejemplo:
CALL mysql.create_vector_index('vectorIndex',
'db.books',
'embedding',
'index_type=TREE_SQ, distance_measure=l2_squared'
);
El nombre del índice que especifique debe ser único en la base de datos.
Parámetros del índice de búsqueda vectorial
Las funciones mysql.create_vector_index
y mysql.alter_vector_index
admiten varios parámetros que puedes especificar con pares clave-valor separados por comas.
Todos los parámetros de la función mysql.create_vector_index
son opcionales. Si especifica una cadena vacía o NULL, se configurarán los valores de los parámetros predeterminados para el índice.
distance_measure
: los valores admitidos sonL2_SQUARED
,COSINE
yDOT_PRODUCT
.L2_SQUARED
es el valor predeterminado.num_neighbors
: el número de vecinos que se devolverán de una consulta de ANN. También puedes anular este parámetro al realizar la consulta de búsqueda. El valor predeterminado es10
.index_type
: especifica el tipo de índice que se va a crear. Los valores válidos son:BRUTE_FORCE
,TREE_SQ
yTREE_AH
.BRUTE_FORCE
es el valor predeterminado de una tabla que tiene menos de 10.000 filas.TREE_SQ
es el valor predeterminado de una tabla que tiene 10.000 filas o más.
Para especificar el tipo de índice
TREE_AH
oTREE_SQ
, el tamaño de la tabla base debe ser superior a 1000 filas.num_parititions
: especifica el número de clústeres de k-means que se van a crear. Este parámetro solo se permite si ha configurado unindex_type
. Esta opción no se aplica aBRUTE_FORCE
. Si especifica el tipo de índiceTREE_SQ
oTREE_AH
, el tamaño de la tabla base debe ser mayor o igual que num_partitions * 100.
Modificar un índice de búsqueda vectorial
CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');
La función alter_vector_index
se usa explícitamente para volver a compilar un índice de búsqueda vectorial. Para usar esta función, el índice ya debe existir. Puede que quieras
recompilar un índice en los siguientes casos:
- Para volver a crear el índice con otras opciones. Por ejemplo, puede que quieras usar otro tipo de índice u otra medida de distancia.
- Para volver a crear el índice porque la tabla base ha sufrido cambios importantes en el lenguaje de manipulación de datos. Por ejemplo, debes volver a entrenar el índice de búsqueda de vectores en función de los datos de la tabla base.
Todos los parámetros para volver a compilar el índice son idénticos a los que se pueden usar para crear el índice y también son opcionales. Si especifica una cadena vacía o NULL al volver a compilar el índice, este se volverá a compilar en función de los parámetros especificados en el momento de la creación del índice. Si no se proporcionan parámetros al crear el índice, se usarán los valores predeterminados.
El índice de búsqueda de vectores ya creado está disponible durante la operación alter_vector_index
. Puedes seguir realizando consultas de búsqueda en el índice.
Eliminar un índice de búsqueda vectorial
No puedes realizar una operación DDL en una tabla que tenga un índice de búsqueda de vectores. Antes de realizar la operación DDL en la tabla, debe eliminar el índice de búsqueda vectorial.
CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');
Consultar incrustaciones de vectores
En esta sección se proporcionan ejemplos de las diferentes formas en las que puede consultar las inserciones de vectores.
Ver las incrustaciones de vectores
SELECT vector_to_string(embedding) FROM books;
Obtener la búsqueda exacta de vecinos de una incrustación de vector
SELECT id,cosine_distance(embedding,
string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;
Obtener la búsqueda de vecinos aproximada de una incrustación de vector
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
Para realizar una búsqueda de ANN, se admiten dos parámetros. Ambos son opcionales.
- num_partitions: especifica el número de particiones que se van a sondear para una búsqueda de vectores ANN. Si no especifica el número de particiones, la búsqueda usará un valor generado en función del tamaño de la tabla, el número de particiones del índice de búsqueda vectorial y otros factores.
- num_neighbors: especifica el número de vecinos que se van a devolver. Este valor anula el valor definido en el momento de la creación del índice de búsqueda vectorial.
Filtrar incrustaciones de vectores
Usa columnas adicionales como predicados para ajustar el filtrado de los resultados de las consultas de inserciones de vectores. Por ejemplo, si añade una columna printyear
, puede añadir un año específico como filtro a su consulta.
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;
Consultar la distancia de una incrustación de vector
En esta sección se proporcionan ejemplos de funciones de distancia de vectores que están disponibles para la búsqueda de kNN.
Obtener la distancia del coseno
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Obtener la distancia del producto escalar
SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Obtiene la distancia L2 al cuadrado.
SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Obtener filas a una distancia determinada
SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;
Puedes combinarlo con ORDER BY
y LIMIT
SELECT id, vector_to_string(embedding),
l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;
Monitorizar índices de búsqueda vectorial
Para obtener información en tiempo real sobre todos los índices de búsqueda vectorial de la instancia, usa la tabla information_schema.innodb_vector_indexes
.
Para ver la tabla, ejecuta el siguiente comando:
SELECT * FROM information_schema.innodb_vector_indexes;
La salida de ejemplo podría ser la siguiente:
*************************** 1. row *************************** INDEX_NAME: test.t4_index TABLE_NAME: test.t4_bf INDEX_TYPE: BRUTE_FORCE DIST_MEASURE: SquaredL2Distance STATUS: Ready STATE: INDEX_READY_TO_USE PARTITIONS: 0 SEARCH_PARTITIONS: 0 INITIAL_SIZE: 40000 CURRENT_SIZE: 40000 QUERIES: 0 MUTATIONS: 0 INDEX_MEMORY: 160000 DATASET_MEMORY: 0
En la tabla information_schema.innodb_vector_indexes
, puede ver lo siguiente:
- Las opciones que se pueden generar. Es decir,
num_partitions
o el número de particiones que se van a sondear en una consulta. - Las columnas
STATE
ySTATUS
indican el estado actual del índice. Durante la fase de compilación, la columna de estado proporciona información sobre el progreso de la fase de compilación del índice de búsqueda vectorial. - La columna
INITIAL_SIZE
indica el tamaño de la tabla durante la creación del índice. Puedes comparar este tamaño conCURRENT_SIZE
para hacerte una idea de cuánto ha cambiado el índice desde su creación debido a las DMLs de la tabla base. - Las columnas
QUERIES
yMUTATIONS
te ofrecen estadísticas en tiempo real sobre la carga del índice. - Las columnas
INDEX_MEMORY
yDATASET_MEMORY
proporcionan información sobre el consumo de memoria del índice.INDEX_MEMORY
indica la cantidad de memoria que consume el índice yDATASET_MEMORY
indica la cantidad de memoria adicional que se consume durante el tiempo de compilación.
Para obtener una lista de los índices de vectores de búsqueda creados en la instancia, puede consultar la tabla del diccionario de datos mysql.vector_indexes
.
Para ver la tabla, ejecuta el siguiente comando:
SELECT * FROM mysql.vector_indexes;
Ejemplo de salida:
*************************** 1. row *************************** index_name: test.index1 table_name: test.t1 column_name: j index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED status: ACTIVE create_time: 2024-04-08 22:46:21 update_time: 2024-04-08 22:46:21 1 row in set (0.00 sec)
Limitaciones
- Solo puede haber una columna de inserción de vector por tabla.
- Solo puede haber un índice de búsqueda vectorial por tabla.
- Una incrustación de vector puede tener hasta 16.000 dimensiones.
- No se admite la creación de particiones a nivel de tabla de InnoDB en tablas con columnas de inserción de vectores.
- Si la instancia se reinicia tras un apagado incorrecto, Cloud SQL volverá a compilar el índice de búsqueda de vectores automáticamente.
- Mientras se vuelve a crear el índice de búsqueda de vectores, la tabla base es de solo lectura.
- Si Cloud SQL no puede obtener un bloqueo en la tabla en el tiempo especificado, es posible que no se pueda volver a compilar el índice automáticamente.
- Si la recompilación automática del índice falla, debes recompilarlo manualmente.
- Para añadir una columna de inserciones vectoriales, la tabla debe tener una clave principal.
Cloud SQL no admite claves principales de los tipos
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
ni de datos espaciales. Las claves primarias compuestas no pueden incluir ninguno de estos tipos. - Si hay un índice de búsqueda vectorial en una tabla, no se permiten las operaciones DDL. El índice de búsqueda vectorial debe eliminarse antes de realizar operaciones DDL en la tabla base.
- Las incrustaciones de vectores no se admiten en tablas que no sean InnoDB ni en tablas temporales.
- La columna de inserción de vector no puede ser una columna generada.
- El predicado
NEAREST..TO
se puede combinar con otros predicados "escalares" medianteAND
oOR
. Los predicados escalares de la tabla se evalúan después de aplicar los predicados vectoriales. - El predicado
NEAREST..TO
solo se admite en una instrucciónSELECT
. Otras instrucciones DML no admitenNEAREST..TO
. NEAREST..TO
no admite subconsultas. No se puede añadir una restricción a la clave principal de la tabla base si hay un índice de búsqueda vectorial.El prefiltrado solo se puede realizar mediante funciones de distancia y usando
ORDER BY
conLIMIT
.Por ejemplo, si crea la siguiente tabla:
CREATE TABLE books ( bookid INT PRIMARY KEY, title VARCHAR(1000), author VARCHAR(100), printyear int, country VARCHAR(100), bvector VECTOR(1536) USING VARBINARY //bvector is embedding vector of book's plot,genre,reviews etc );
A continuación, puedes usar la siguiente consulta para prefiltrar.
//select query to obtain books by specific author and having similar plot-genre-reviews SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist FROM books where author='cloudsql' ORDER BY dist LIMIT 10
El posfiltrado se admite con
NEAREST..TO
y funciones de distancia.
Solucionar problemas
En caso de fallo, el índice se vuelve a generar automáticamente. Cuando se está reconstruyendo, hay dos restricciones:
- Durante la creación del índice, la tabla base está en modo de solo lectura.
- Mientras se vuelve a generar el índice, las consultas de ANN en los índices existentes fallan.