Vector search

En esta página se describe cómo se implementan las búsquedas vectoriales en instancias de Cloud SQL para MySQL. Cloud SQL te permite almacenar inserciones de vectores, crear índices de vectores y realizar búsquedas de vectores junto con otros datos almacenados.

Almacenamiento de incrustaciones de vectores

Almacena las inserciones vectoriales en una tabla que cumpla las propiedades de atomicidad, coherencia, aislamiento y durabilidad (ACID). Al igual que otros datos relacionales de la tabla, puede acceder a las inserciones de vectores de la tabla con la semántica transaccional actual.

Para establecer una asignación entre las filas de una tabla y las representaciones vectoriales, debe crear una columna en la tabla para almacenar las inserciones vectoriales. La columna debe usar el tipo de datos VECTOR de Cloud SQL e indicar el número de dimensiones que requiere la inserción. La columna de inserción vectorial solo puede almacenar inserciones vectoriales que usen exactamente las mismas dimensiones que especifique al definir la columna.

Una tabla solo puede tener una columna de inserciones de vectores. No hay restricciones en cuanto al número de filas de la tabla.

Para distinguir la columna de inserción vectorial de otras columnas, Cloud SQL añade los símbolos especiales COMMENT y CONSTRAINT a la columna. La restricción es obligatoria para validar las entradas y la anotación de la columna de inserción de vectores se muestra como COMMENT. No puedes modificar ni eliminar el comentario ni la restricción.

Si tienes suficiente espacio de almacenamiento y memoria disponibles en tu instancia de Cloud SQL, puedes tener varias tablas con sus propias columnas de inserción de vectores.

La replicación de datos funciona de la misma forma para la columna de inserción de vectores que para otras columnas de InnoDB de MySQL.

Para ver una lista de las limitaciones y restricciones de las tablas, las columnas y las instrucciones DML de inserciones vectoriales, consulta Limitaciones.

Índices vectoriales

Debes usar un índice vectorial para realizar búsquedas de similitud de ANN en tus inserciones de vectores. Cloud SQL crea índices vectoriales mediante el algoritmo Scalable Nearest Neighbors (ScaNN).

Los índices vectoriales deben cumplir los siguientes requisitos:

  • Solo puedes crear un índice vectorial por tabla.
  • Si tiene varias tablas con inserciones vectoriales en su instancia, puede crear índices vectoriales para cada una de ellas.
  • Si creas un índice vectorial, no puedes añadir una restricción a la clave principal de la tabla indexada.

Para mejorar la calidad de las búsquedas, cree un índice vectorial solo después de cargar la mayor parte de los datos en la tabla base. Si tienes menos de 1000 inserciones en la tabla base, no se podrá crear el índice.

A la hora de decidir si crear un índice vectorial, si tienes un número reducido de filas, plantéate si puedes realizar una búsqueda de los k vecinos más cercanos. La decisión de usar una búsqueda KNN o ANN también depende del número de dimensiones de la inserción vectorial. Un número mayor de inserciones puede requerir un índice vectorial.

Para ver una lista de las limitaciones y restricciones de los índices vectoriales, consulta Limitaciones. Para obtener información sobre cómo crear un índice vectorial, consulta el artículo Crear y gestionar índices vectoriales.

Actualizaciones del índice de vectores

Cloud SQL actualiza los índices vectoriales en tiempo real. Cualquier transacción que realice operaciones de lenguaje de manipulación de datos (DML) en la tabla base también propaga los cambios a los índices vectoriales asociados. Los índices vectoriales se comportan de la misma manera que cualquier otro índice secundario de la tabla. Los índices de vectores son totalmente coherentes desde el punto de vista transaccional y cumplen los requisitos de ACID. Si revierte una transacción, los cambios de reversión correspondientes también se producirán en el índice vectorial.

Replicación de índices vectoriales

Cloud SQL replica los índices vectoriales en todas las réplicas de lectura, incluidas las de replicación en cascada. Cuando creas una réplica de lectura a partir de una instancia principal que tiene inserción de vectores, la réplica de lectura hereda los ajustes de inserción de vectores de la instancia principal. En el caso de las réplicas de lectura, debes habilitar la compatibilidad con la inserción de vectores en cada una de ellas.

En cuanto al impacto en el retraso de la replicación, la creación y el mantenimiento de índices vectoriales funcionan de la misma forma que los índices de MySQL normales.

Persistencia, cierre e impacto en el mantenimiento

Los índices vectoriales se conservan de la misma forma que las tablas base, con compatibilidad total con ACID. Los índices vectoriales siempre están sincronizados con los datos de su tabla base y tienen la misma visibilidad, aislamiento y seguridad en caso de fallo. El índice vectorial no se ve afectado cuando la instancia se cierra o recibe mantenimiento.

Mantenimiento de índices

Después de realizar operaciones DML extensas en la tabla base, es posible que el índice vectorial que entrenaste con los datos iniciales (en el momento de la creación del índice) no refleje el nuevo estado. Esto puede afectar a la calidad de la búsqueda.

El índice consta de dos partes:

  • El árbol de índice. Se crea entrenando con datos ya disponibles. Se mantiene sin cambios durante la vida útil del índice.
  • Las hojas del índice. Contienen todas las filas de datos. Los índices nunca se desincronizan.

El árbol de índice puede perder eficiencia después de ejecutar un gran número de instrucciones DML, ya que las filas se mueven de una hoja a otra. Para actualizar el árbol de índice, debes volver a compilar el índice.

Operaciones de DDL no admitidas en tablas con índices vectoriales

  • Operaciones de modificación de tablas que requieren el algoritmo de copia.
  • Operaciones de modificación de tablas que requieren que se vuelva a compilar la tabla.
  • Elimina o cambia la clave principal.
  • Mueve la tabla a un espacio de tablas general.

Vector search

Cloud SQL proporciona funciones de distancia vectorial que se usan para realizar búsquedas de similitud vectorial de vecinos más cercanos aproximados (ANN) y de K vecinos más cercanos (KNN) en tu instancia. Cuando ejecutas una consulta, el vector de consulta se compara con los vectores de tu conjunto de datos. Las funciones de distancia calculan la distancia entre los vectores mediante una métrica de similitud, como el coseno. Los vectores con la distancia más corta entre ellos son los más similares y se devuelven en los resultados de búsqueda.

Cloud SQL usa las siguientes funciones para medir la distancia entre vectores en búsquedas vectoriales cuando realizas búsquedas vectoriales ANN y KNN:

  • Coseno: mide el coseno del ángulo entre dos vectores. Cuanto menor sea el valor, mayor será la similitud entre los vectores.
  • Producto escalar: calcula el coseno del ángulo multiplicado por el producto de las magnitudes de los vectores correspondientes.
  • Distancia L2 al cuadrado: mide la distancia euclídea entre dos vectores sumando la distancia al cuadrado de cada dimensión.

La búsqueda vectorial de los elementos más cercanos (KNN) es el método de búsqueda preferido cuando necesitas resultados exactos o quieres añadir filtros selectivos. La búsqueda KNN calcula la distancia del vector de consulta con cada inserción del conjunto de datos para encontrar el vecino más cercano. Las búsquedas de vecinos más cercanos (k-NN) en Cloud SQL proporcionan una recuperación perfecta. Las búsquedas de KNN no usan un índice vectorial, por lo que son una buena opción cuando se trabaja con conjuntos de datos más pequeños.

Para realizar una búsqueda KNN, se usa la función vector_distance, que toma dos vectores como entrada: el vector de consulta (lo que estás buscando) y un vector candidato de tu conjunto de datos. Calcula la distancia entre estos dos vectores. Usas vector_distance en una instrucción SELECT. Para obtener más información, consulta Buscar los k vecinos más cercanos (KNN).

Si observas que KNN no funciona bien, puedes crear un índice vectorial más adelante y seguir usando approx_distance en tu aplicación para las búsquedas de ANN.

La búsqueda vectorial ANN es el tipo de búsqueda preferido cuando la eficiencia de las consultas es un factor importante. Acelera las búsquedas de similitud calculando la distancia entre el vector de consulta y solo una parte de los vectores de tu conjunto de datos. Para ello, Cloud SQL organiza los datos en clústeres o particiones y, a continuación, centra la búsqueda en los clústeres más cercanos a la consulta. Las búsquedas de ANN requieren índices vectoriales. Estos índices priorizan la velocidad de búsqueda por encima de la recuperación perfecta. En Cloud SQL, el tipo de índice TREE_SQ se usa para las búsquedas de ANN.

Para realizar una búsqueda de ANN, usa la función approx_distance con una opción de medición de distancia. Puedes usar approx_distance en una lista ORDER BY o SELECT, y se permite una cláusula LIMIT para limitar los resultados de búsqueda. También puedes añadir una cláusula WHERE para filtrar los resultados de búsqueda después de la consulta. Para obtener más información, consulta Buscar los vecinos más cercanos aproximados (ANN).

En algunos casos, una búsqueda de ANN se convierte en una búsqueda de KNN. Para obtener más información, consulta Comprobar el estado de la alternativa para las búsquedas de ANN.

Requisitos

Cloud SQL requiere que habilites las inserciones vectoriales en la instancia mediante la marca cloudsql_vector antes de añadir inserciones vectoriales. Para obtener más información, consulta el artículo Habilitar e inhabilitar las inserciones vectoriales en tu instancia.

Limitaciones

A continuación, se indican las limitaciones de las tablas que tienen una columna de inserción vectorial:

  • Solo puede haber una columna de inserción de vector por tabla.
  • Solo puede haber un índice vectorial por tabla.
  • Las incrustaciones de vectores tienen un límite de 16.000 dimensiones.
  • La columna de inserción de vector no puede ser una columna generada.
  • No se admite la creación de particiones a nivel de tabla en tablas con columnas de inserción de vectores.
  • Las claves principales que usan los tipos de datos BIT, BINARY, VARBINARY, JSON, BLOB o TEXT, o bien datos espaciales, no se admiten en los índices vectoriales. Las claves principales compuestas tampoco pueden incluir ninguno de estos tipos.
  • Si hay un índice vectorial, no puedes añadir una restricción a la clave principal de la tabla base.
  • Cuando hay un índice vectorial en una tabla, hay algunas operaciones de DDL que no se pueden realizar. Para obtener más información, consulta Operaciones de DDL no admitidas en tablas con índices vectoriales.

Estas son las restricciones de las consultas de búsqueda vectorial:

  • La función approx_distance solo se puede usar en una lista ORDER BY o SELECT.
  • Los predicados que implican la tabla base se pueden usar en la condición WHERE en combinación con expresiones approx_distance en la lista ORDER BY o SELECT. Los predicados de condición WHERE se evalúan después de que se evalúen las funciones de vector approx_distance.

Prácticas recomendadas para trabajar con índices vectoriales

En esta sección se ofrecen prácticas recomendadas para trabajar con índices vectoriales. Cada carga de trabajo es diferente, por lo que es posible que tengas que hacer ajustes.

  • Después de realizar operaciones DML importantes, es recomendable volver a compilar el índice.
  • Por lo general, es aceptable dejar que Cloud SQL calcule el número de hojas que se van a usar. Si tienes un caso práctico en el que quieres especificar el número de hojas, te recomendamos que tengas al menos 100 vectores por hoja para obtener el mejor recuerdo.

Siguientes pasos