El 2 de noviembre de 2026, revisé la lógica de detección de duplicados en los títulos de las publicaciones del blog. Anteriormente, todas las incrustaciones guardadas se leían en Python para calcular la similitud, pero esta vez lo cambié para que solo se obtengan los candidatos de títulos cercanos mediante el índice de vectores de MariaDB 11.8+.
En este momento, un aspecto crítico a considerar era la cláusula de ordenamiento en SQL. ORDER BY 1 - VEC_DISTANCE_COSINE(...) DESC representa el orden por similitud, pero si envolvemos la función de distancia dentro de una expresión de cálculo, podríamos no poder utilizar el índice de vectores. La documentación oficial explica que se debe ordenar directamente por la función de distancia o su alias en orden ascendente y usar LIMIT en conjunto. Documentación oficial de MariaDB
Por lo tanto, establecí la búsqueda en función de la distancia, y convertí únicamente los valores devueltos en Python mediante similarity = 1 - distance. A continuación se muestra un ejemplo de enlace de SQLAlchemy con solo el código esencial. A :query_vector se le pasa la cadena JSON del vector generado por el mismo modelo de incrustación.
SELECT translation_id,
VEC_DISTANCE_COSINE(embedding, VEC_FromText(:query_vector)) AS distance
FROM title_vectors
ORDER BY VEC_DISTANCE_COSINE(embedding, VEC_FromText(:query_vector)) ASC
LIMIT 10;Este ejemplo parte de la premisa de que existe un índice de vectores DISTANCE=cosine sobre embedding. Si el método de distancia utilizado al crear el índice difiere de la función de búsqueda empleada, el índice no se utilizará. Documentación de VEC_DISTANCE_COSINE
Además, en este cambio añadí una prueba de integración que verifica si el key del resultado de EXPLAIN corresponde al índice de vectores esperado. Aunque se requiere una medición aparte para evaluar la magnitud de la mejora en el rendimiento, se puede observar en el código que la ruta de búsqueda, que antes leía todos los vectores en Python, se ha reducido a una consulta de candidatos.
Si hemos creado un índice, verifiquemos también si la consulta realmente lo está utilizando. Aunque expresamos el mismo orden mediante fórmulas, el plan de ejecución no necesariamente coincide.




