GUÍA PRÁCTICA DE DESNORMALIZACIÓN EN MYSQL
Aunque en bases de datos siempre nos enseñan la importancia de la normalización de una base de datos para evitar redundancia, existe una técnica opuesta pero muy poderosa: la desnormalización de una base de datos. En MySQL, esta práctica es ampliamente utilizada en aplicaciones reales para mejorar significativamente el rendimiento.La desnormalización de una base de datos consiste en agregar datos duplicados de forma intencional en una o varias tablas para reducir la cantidad de consultas "JOIN" y acelerar las lecturas.
Aunque parezca ir en contra de las buenas prácticas, en ciertos escenarios duplicar información hace que tu aplicación sea más rápida.
¿Para qué sirve la desnormalización en MySQL?
- Acelerar consultas complejas que involucran múltiples tablas.
- Reducir la cantidad de "JOIN", que son una de las operaciones más costosas en MySQL.
- Mejorar el rendimiento en aplicaciones con muchas lecturas.
- Optimizar reportes y dashboards que consultan grandes volúmenes de datos.
¿Cómo funciona?
Escenario normalizado
-- Tabla Pedidos
CREATE TABLE pedidos (
id INT PRIMARY KEY,
cliente_id INT,
fecha DATE
);
-- Tabla Clientes
CREATE TABLE clientes (
id INT PRIMARY KEY,
nombre VARCHAR(100),
telefono VARCHAR(20)
);
SELECT p.id, c.nombre, p.fecha
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id;
Versión desnormalizada
CREATE TABLE pedidos_desnormalizados (
id INT PRIMARY KEY,
cliente_id INT,
cliente_nombre VARCHAR(100), -- Dato duplicado
telefono VARCHAR(20), -- Dato duplicado
fecha DATE
);
SELECT id, cliente_nombre, fecha
FROM pedidos_desnormalizados
WHERE id = 101;
Ventajas y Desventajas
Ventajas
- Consultas mucho más rápidas, especialmente con millones de registros.
- Menor uso de CPU y memoria al evitar JOINs.
- Ideal para índices más efectivos.
- Excelente para sistemas de reporting, e-commerce, analytics y aplicaciones de alta concurrencia de lectura.
Desventajas
- Mayor consumo de espacio en disco.
- Actualizaciones más complejas: sise cambia un valor, se debe actualizar todas las tablas donde esté duplicado.
- Mayor riesgo de datos inconsistentes si no se gestionan bien las actualizaciones.
- Más difícil de mantener la integridad referencial.
¿Cuándo debo desnormalizar en MySQL?
Se recomienda desnormalizar una base de datos cuando:- La aplicación tiene muchas más lecturas que escrituras.
- Las consultas "JOIN" son lentas incluso con índices optimizados.
- Se necesita generar reportes o dashboards en tiempo real.
- Se trabaja con millones de registros (Big Data lite).
- Estás construyendo sistemas de e-commerce, redes sociales o plataformas de análisis.
Consejos prácticos para MySQL
- Utilizar Triggers para mantener los datos duplicados actualizados automáticamente.
- Combinar normalización y desnormalización: manteniendo la versión normalizada como fuente de verdad y tablas desnormalizadas para lecturas rápidas.
- Implementar usando caché como Redis)junto con desnormalización de bases de datos para mejores resultados.
- Monitorizar con "EXPLAIN" y "EXPLAIN ANALYZE" antes y después de desnormalizar la base de datos.
- Documenta claramente qué datos están duplicados y por qué.