Guía de MariaDB Vector: Guarda Embeddings de IA

11 minuto(s)

Con la llegada de la extensión nativa MariaDB Vector en las versiones recientes, los desarrolladores ya no necesitan migrar obligatoriamente a bases de datos vectoriales dedicadas (como Pinecone o Milvus) ni mantener infraestructuras híbridas complejas para desplegar funciones de Inteligencia Artificial.

Ahora es posible almacenar, indexar y consultar embeddings vectoriales directamente utilizando la sintaxis SQL tradicional dentro de MariaDB.

Este tutorial te enseñaré a como guardar embeddings de IA de forma fácil, vamos con ello.

1. Conceptos Fundamentales y Requisitos de Entorno

Un embedding vectorial es una representación numérica de datos (texto, imágenes o audio) en un espacio multidimensional donde los conceptos similares se ubican geométricamente cerca unos de otros. La distancia o similitud entre dos vectores se mide comúnmente utilizando la similitud coseno o la distancia euclidiana.

Nota: Las funciones de búsqueda vectorial requieren la rama moderna de MariaDB (versión 11.4 LTS o superior) donde el motor nativo implementa de forma eficiente estas estructuras de datos sin penalizar las operaciones relacionales tradicionales.

2. Estructura de la Base de Datos: El Tipo Vector

Para almacenar un embedding generado por un modelo de lenguaje (como por ejemplo, vectores de 1536 dimensiones de OpenAI o de 384 dimensiones de modelos locales optimizados en Ollama y otras herramientas), MariaDB introduce el tipo de datos específico para vectores. A continuación, puedes ver el script SQL para crear una tabla llamada articulos_ia y en ella agregamos un campo de tipo VECTOR llamado embedding:


En este ejemplo, definimos un vector con una dimensión fija de d = 384, idónea para tareas eficientes de ejecución local en el navegador o en servidores de recursos optimizados mediante WebGPU o WebLLM.

3. Implementación Práctica en Node.js (TypeScript)

Mi proyecto tiene la siguiente estructura inicial:

Estructura del proyecto de Node JS
Puedes crear tu propia estructura de archivos y carpetas

3.1 Instalación de Dependencias

Antes de codificar, inicializa el entorno e instala los paquetes necesarios ejecutando en tu terminal:

3.2 Conexión a MariaDB

Para interactuar con los datos vectoriales desde el backend de una aplicación moderna, empleamos el controlador estándar. La clave radica en formatear el array numérico del embedding como una cadena JSON válida o un formato compatible durante la inserción SQL.

En el archivo database.ts nos conectamos a MariaDB:

3.3 Script de Inserción de Contenido y Embeddings

Cuando utilizas un modelo de lenguaje (como un LLM local en Ollama o una API externa), este te devuelve el embedding en forma de un array de números decimales (ej. [0.0123, -0.4567, … 0.8912]).

Para guardarlo correctamente, MariaDB requiere que transformes ese array en un formato de texto legible utilizando corchetes [x,y,z] para que la función nativa VEC_FromText() pueda procesarlo y almacenarlo en la columna binaria de destino.

En el archivo embeddingService.ts agregamos lo siguiente, he colocado comentarios para explicar que hacen las líneas de código:

3.4 Ejemplo de Uso Completo

Para integrar todo, imagina un flujo donde recibes datos de un formulario de backend o un pipeline de consumo de contenido.

En el archivo app.ts agregamos lo siguiente (servidor de Node JS):


Iniciamos el servidor de Node.js y se inserta el artículo en MariaDB:


Si revisamos nuestra tabla, podemos ver que no solo hemos guardado el contenido del artículo, sino también los valores vectoriales en el campo o la columna embedding:

Datos insertados en MariaDB
Es complemtamente normal ver caracteres extraños en la columna embedding

Lo que estás viendo en la columna embedding es el comportamiento correcto de MariaDB.

Internamente, el motor de la base de datos no almacena los vectores como un texto plano (“[0.15234, …]”) porque ocuparía demasiado espacio y haría que las búsquedas se volvieran lentas. En su lugar, MariaDB optimiza el almacenamiento comprimiendo el array numérico y guardándolo en un formato binario de punto flotante de forma nativa.

Como HeidiSQL intenta renderizar esos bytes binarios puros como si fueran caracteres de texto tradicionales (ASCII/UTF-8), el resultado visual son esos símbolos extraños (¤ÿ…).

4. Optimización del Rendimiento e Indexación

Si dejamos la tabla tal como está, cada vez que hagamos una búsqueda por similitud conceptual mediante VEC_DISTANCE, MariaDB se verá obligado a realizar un escaneo completo de toda la tabla (Table Scan), calculando la distancia fila por fila. Si bien esto funciona rápido con unos pocos cientos de artículos, destruirá el rendimiento y causará cuellos de botella cuando guardemos miles de vectores.

4.1 Creación de Índices HNSW

Para mitigar la latencia y lograr consultas que respondan en milisegundos, MariaDB Vector implementa estructuras avanzadas de indexación aproximada. El estándar moderno más eficiente para búsquedas de alta dimensionalidad es el índice HNSW (Hierarchical Navigable Small World).

Este tipo de índice organiza los embeddings geométricamente en capas jerárquicas interconectadas (similar a una red de “seis grados de separación”), lo que le permite al motor de la base de datos descartar millones de registros de inmediato y saltar directo a la zona donde residen los datos conceptualmente más cercanos.

En la consola de consultas en HeidiSQL o ejecútalo desde tu CLI para añadir el índice a tu tabla:


Nota: He colocado M = 16, que es un valor excelente en producción para un equilibrio óptimo entre precisión semántica, velocidad de inserción y consumo de RAM).

Si prefieres dejar que MariaDB elija los mejores valores por defecto:

Puedes crearlo de forma súper limpia omitiendo los parámetros opcionales, el motor asignará automáticamente la métrica de distancia óptima (Euclidiana) y su configuración base:


Si verificamos nuestra tabla, al lado izquierdo del campo embedding aparece una llave de color morada:

El campo embedding con un índice activo
La herramienta HeidiSQL me vino instalada con MariaDB (Free Community)

Esa llave morada que apareció al lado de embedding en HeidiSQL es la representación visual de que esa columna ahora posee un índice activo (específicamente un nuevo índice vectorial HNSW).

En las herramientas de administración de bases de datos como HeidiSQL:

  • La llave amarilla en id representa la Primary Key (Clave Primaria).
  • La llave morada representa una Clave Secundaria o un Índice (Index) asignado a esa columna para acelerar las búsquedas.

¿Qué hizo exactamente ese comando tras bambalinas?

Al ejecutar el ALTER TABLE, MariaDB no cambió los datos de los artículos, sino que construyó una estructura geométrica intermedia en la memoria y el disco.

Para entender la diferencia de rendimiento de cara al resultado, esto es lo que pasó conceptualmente:

  1. Sin el índice (Antes): Cuando Node.js ejecutaba una búsqueda vectorial, MariaDB tenía que hacer un Table Scan. Calculaba la distancia matemática elemento por elemento, comparando tu consulta contra cada fila de la tabla de forma lineal. Con 4 filas es instantáneo, pero con 50,000 registros la base de datos se congelaría.
  2. Con el índice HNSW (Ahora): MariaDB organizó los embeddings binarios dentro de un gráfico jerárquico de “red de pequeños mundos”. Almacena caminos o rutas basadas en la proximidad matemática de los vectores.

Cuando realices una consulta semántica en el futuro, el motor usará esa “llave morada” para saltar a través de las capas del gráfico, descartando instantáneamente las ramas que no se parecen en nada a tu búsqueda y localizando los registros más cercanos en un par de milisegundos.

5. Búsqueda de Similitud de Vectores (Vector Search)

Con los registros en nuestra tabla y el índice mHNSW creado, el paso final es programar la lógica que consultará estos datos mediante proximidad semántica.

Al igual que tuvimos que usar la función VEC_FromText() para indicarle a MariaDB cómo interpretar las dimensiones en la inserción, usaremos la misma función en la cláusula de selección con VEC_DISTANCE().

5.1 Servicio de Búsqueda

Creamos un archivo llamado services/searchService.ts y le incluimos el tipado fuerte para los resultados que retornará el pool de conexiones:

5.2 Script de Prueba Final

Creamos un archivo llamado src/searchTest.ts

Para verificar que todo el flujo funcione, crearemos un script ejecutable que simule la duda de un usuario en un buscador:


Ejecutamos el script y obtenemos:


Al ejecutar este script, el tiempo de respuesta en la consola será de apenas 0.001 o 0.002 segundos, gracias a que el optimizador de consultas de MariaDB detectará la “llave morada” en el campo embedding, usando el gráfico HNSW en lugar de leer secuencialmente el disco duro.

Conclusión

Gracias a MariaDB 11.4+, el ecosistema de aplicaciones de IA se ha democratizado. Ya no se requiere la complejidad de sincronizar bases de datos tradicionales con herramientas externas como Pinecone. Ahora, con unas pocas líneas de código en TypeScript y el poder de los índices HNSW, cualquier servidor independiente o VPS puede soportar búsquedas semánticas nativas y flujos RAG con un rendimiento impecable.

MariaDB 03-07-2026 03-07-2026 Crear un PostEventos DevsForo

Sobre el Autor

Juan Castro

Juan Castro — Ingeniero de Software con más de 17 años de experiencia en desarrollo, ia, ml, devops, data science, ciberseguridad y tecnología.

Certificados oficiales:
Certificado Microsoft Azure Fundamentals Certificado AWS Designing Event-Driven Architectures Certificado Google Desarrollo de Aplicaciones Móviles

Ver más

IA