OPTIMIZACIÓN DE SQL EN MYSQL: TÉCNICAS Y BUENAS PRÁCTICAS
Usar índices adecuados
Los índices correctos aceleran las búsquedas, filtros, joins y ordenamientos. Ejemplo:
-- Índice en columna frecuentemente usada
CREATE INDEX idx_cliente_id ON pedidos (cliente_id);
Evitar
Consultas sin índice en las columnas usadas en "WHERE" o "JOIN"
Por qué es clave
Reduce las lecturas de disco, especialmente en InnoDB, y mejora drásticamente el rendimiento de las consultas.
Seleccionar solo lo necesario
No usar "SELECT *". Solo seleccionar las columnas que realmente se necesitan. Ejemplo:
SELECT id, nombre, total
FROM pedidos;
Evitar
Por qué es clave
Menos datos transferidos por la red, menor uso de memoria y mejor tiempo de respuesta.
Filtrar pronto y filtrar bien
Usar "WHERE" para reducir el conjunto de datos lo antes posible. Ejemplo:
SELECT * FROM pedidos
WHERE estado = 'ENTREGADO';
Evitar
SELECT * FROM pedidos; -- y filtrar después en la aplicación
Por qué es clave
Menos filas procesadas desde el inicio y esto significa menos carga para el motor de almacenamiento, InnoDB, y para el servidor.
Evita funciones en columnas
No aplicar funciones sobre columnas en "WHERE" o "JOIN" ya que suele impedir el uso de índices. Ejemplo:
WHERE fecha >= '2024-01-01'
AND fecha < '2024-02-01'
Evitar
WHERE DATE(fecha) = '2024-01-01'
Por qué es clave
Permite que el optimizador de MySQL use índices de forma eficiente y evita escaneos completos de tabla (full table scans).
Usa JOINs eficientes
Hay que asegurarse de tener índices en las columnas que usas para unir tablas. Ejemplo:
-- Índices en las columnas de JOIN
SELECT *
FROM a
JOIN b ON a.id = b.a_id;
Evitar
Joins sin índices en las columnas de unión.
Por qué es clave
Mejora el rendimiento de los JOINs y evita operaciones costosas (como hash joins o nested loop innecesarios en tablas grandes).
Usar EXPLAIN siempre
Analiza el plan de ejecución antes de optimizar a ciegas. Conoce realmente qué está haciendo el motor. Ejemplo:
EXPLAIN
SELECT * FROM pedidos
WHERE cliente_id = 123;
-- En MySQL 8.0.18+ también puedes usar:
EXPLAIN ANALYZE
SELECT * FROM pedidos
WHERE cliente_id = 123;
Evitar
Adivinar el problema sin analizar el plan de ejecución.
Por qué es clave
Te muestra cuellos de botella, tipo de acceso, index, range, ALL…, número estimado de filas y posibles mejoras reales.7. Mantén tus estadísticas actualizadasLas estadísticas actualizadas permiten al optimizador de MySQL tomar mejores decisiones. Ejemplo:
ANALYZE TABLE pedidos;
-- O para varias tablas:
ANALYZE TABLE pedidos, clientes, detalles;
Evitar
Trabajar con estadísticas desactualizadas (especialmente después de cargas masivas de datos).Por qué es clave:
Mejores planes de ejecución, estimaciones de cardinalidad más precisas y rendimiento más consistente.
Bonus extra
- Usar "LIMIT" para pruebas y desarrollo.
- Evitar subconsultas correlacionadas innecesarias, mejor usar "JOIN" o "EXISTS" cuando sea posible.
- Considerar tablas temporales o índices compuestos para consultas pesadas.
- Revisar y optimizar consultas lentas periódicamente, usar "slow query log".
- Pensar en el rendimiento desde el diseño del esquema, tipos de datos adecuados, normalización vs. desnormalización, etc..