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

:
SELECT * FROM pedidos;

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..