Contenido del curso
Automatización, Reutilización y Eficiencia en Consultas
Trabajo con Datos Avanzados (JSON)
- 11

Columnas JSON en MySQL: qué son y cómo modificarlas
18:27 min - 12

Índices en columnas JSON con MySQL 8
Viendo ahora - 13

Uso del Left Join en MySQL para Consultas Avanzadas
26:09 min - 14

Engines y Codificaciones en MySQL: MyISAM vs InnoDB y UTF8MB4
08:13 min - 15

Gestión de Usuarios y Permisos en Bases de Datos MySQL
14:06 min
Gestión Avanzada y Análisis de Bases de Datos
Índices en columnas JSON con MySQL 8
Resumen
Trabajar con columnas JSON en MySQL te da flexibilidad, pero también plantea un reto: ¿cómo buscar dentro de esos objetos sin sacrificar rendimiento? Aquí verás cómo extraer datos de un JSON, homogeneizar su estructura y crear índices sobre columnas generadas para acelerar consultas en MySQL 8.
¿Cómo buscar datos dentro de una columna JSON en MySQL?
La búsqueda sobre columnas JSON parte de una idea simple: extraer la llave que te interesa y compararla. Antes de buscar, conviene poblar la tabla con datos repetidos para simular un escenario real, usando un update masivo condicionado por where rand() < 0.4 [03:10].
Una vez con datos, puedes consultar así:
sql SELECT * FROM products WHERE JSON_EXTRACT(data, '$.brand') = 'Pear' LIMIT 10;
Esta consulta le pide a MySQL que extraiga del objeto data, siguiendo la ruta $.brand, y compare con el valor Pear. Lo interesante es que JSON_EXTRACT es una expression, así que puedes usarla también en el SELECT para traer solo el dato que te importa, no toda la columna.
¿Para qué sirve JSON en una base de datos relacional? Para datos que a veces vienen y a veces no, valores que cambian de forma o listas que pueden crecer sin que conozcas su estructura final. Si los datos son consistentes, mejor usa relaciones.
¿Qué diferencia hay entre la flecha doble y la flecha sencilla en JSON?
MySQL ofrece dos atajos para reemplazar JSON_EXTRACT:
data->'$.brand': equivale aJSON_EXTRACT. Devuelve el valor como tipo JSON, con comillas incluidas si es string.data->>'$.brand': extrae y además unquote, devolviendo un string nativo de MySQL listo para operar.
La flecha doble (->>) te ahorra el paso de castear. Si fuera un número, ya podrías sumarlo. Si fuera un string, ya no arrastra las comillas del esquema JSON.
¿Cómo accedo a un objeto anidado dentro de otro JSON?
Cuando una llave guarda otro objeto, por ejemplo brand con founder y year adentro, no puedes encadenar -> y ->> libremente como en versiones beta antiguas. En MySQL 8.1 debes usar la ruta explícita completa con una sola flecha [16:40]:
sql SELECT data->>'$.brand.founder' FROM products WHERE product_id = 12;
Esta versión es más estricta, pero también más eficiente. Intentar encadenar flechas sobre subobjetos lanza error según los settings de la instalación.
¿Por qué conviene homogeneizar la estructura de un JSON?
Uno de los grandes problemas al trabajar con columnas JSON es que cada tupla puede tener una forma distinta. Si una fila guarda brand como string y otra como objeto, operar sobre el conjunto se vuelve caro y propenso a errores.
La recomendación es mantener la estructura lo más uniforme posible cuando tengas el control del esquema. Esto facilita búsquedas, índices y futuras migraciones. JSON es maleable, pero esa maleabilidad debe usarse con criterio.
¿Cómo crear un índice sobre una columna JSON en MySQL?
MySQL no permite índices directamente sobre columnas JSON porque su contenido es demasiado heterogéneo. La solución es crear una columna generada que extraiga la llave y luego indexar esa columna.
El proceso tiene tres pasos:
- Agregar una columna generada que extraiga la llave del JSON.
- Manejar los valores nulos con
IFNULLpara evitar inconsistencias. - Crear el índice sobre la columna generada.
sql ALTER TABLE products ADD COLUMN json_brand VARCHAR(30) AS (IFNULL(data->>'$.brand', ''));
CREATE INDEX json_brand_index ON products(json_brand);
La función IFNULL recibe un valor y, si resulta nulo, devuelve el segundo argumento como respaldo. Aquí lo usamos para reemplazar NULL por un string vacío en la columna generada [22:30].
¿Qué es una columna generada en MySQL? Es una columna cuyo valor se calcula automáticamente a partir de una expresión sobre otras columnas. No la insertas tú; MySQL la mantiene actualizada.
¿Cuándo se nota la diferencia de un índice JSON?
Con 3.000 productos en una conexión local, la diferencia es mínima: pasas de 0.01 a 0.00 segundos. Pero en producción el panorama cambia.
Imagina un servidor con 150 tareas en cola, threads virtualizados y miles o millones de tuplas. Ahí, una columna correctamente indexada decide si un usuario ve la pantalla renderizada o cierra el tab antes de que cargue. La optimización suma cuando se acumulan variables pequeñas.
¿Puedo indexar directamente una columna JSON? No. MySQL no acepta índices sobre tipo JSON. Debes crear una columna generada con la llave extraída y poner el índice sobre esa columna.
¿Qué cambió entre MySQL 5.7 y MySQL 8 para trabajar con JSON?
MySQL introdujo soporte JSON en la versión 5.7. Al saltar a la familia 8, el manejo se volvió más estricto y profesional. Ya no se permite el encadenado libre de flechas sobre subobjetos, y debes declarar rutas explícitas completas.
Este cambio puede romper queries antiguos, pero garantiza un comportamiento más predecible y un rendimiento superior al combinarlo con columnas generadas e índices.
Con esto cierras el ciclo de JSON en MySQL: extracción eficiente con la flecha doble, normalización con IFNULL y aceleración con índices sobre columnas generadas. ¿Has probado indexar columnas JSON en tu proyecto? Cuéntame qué patrón usaste.