Saltar al contenido
DBAExperts
MySQL Rendimiento

Cómo crear un índice en MySQL y cuándo usar uno compuesto

Un índice acelera las lecturas a costa de ralentizar ligeramente las escrituras y ocupar espacio. La clave no es tener muchos índices, sino los correctos: los que sirven a tus consultas más frecuentes o más costosas.

  1. 1

    Identifica la columna que filtra o une

    Indexa columnas que aparecen en WHERE, JOIN u ORDER BY. Un índice sobre una columna que nadie filtra es peso muerto.

    EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 42;
  2. 2

    Crea un índice simple

    Sobre una tabla grande, crear un índice puede tardar y consumir recursos. En producción hazlo en ventana de bajo tráfico.

    CREATE INDEX idx_pedidos_cliente ON pedidos (cliente_id);
  3. 3

    Usa un índice compuesto cuando filtras por varias columnas

    El orden importa: pon primero la columna más selectiva o la que uses en igualdad, y después la de rango u ordenamiento. Este índice sirve para filtrar por cliente_id, o por cliente_id y fecha juntos.

    CREATE INDEX idx_pedidos_cliente_fecha ON pedidos (cliente_id, fecha);
  4. 4

    Confirma que la consulta usa el índice

    Revisa el plan con EXPLAIN: busca que la columna key ya no sea NULL y que rows baje respecto al escaneo completo.

    EXPLAIN SELECT * FROM pedidos WHERE cliente_id = 42 ORDER BY fecha;

// el error común

Un índice compuesto (a, b) sirve para filtrar por a, o por a y b, pero NO para filtrar solo por b. Es el error más común: crear el índice en el orden equivocado y creer que cubre una consulta que en realidad hace escaneo completo.

// cuándo conviene un experto

Cuando agregar índices ya no mejora nada o incluso empeora las escrituras, el problema suele estar en el diseño de consultas o del esquema. En dba.mx afinamos índices con base en el plan real de ejecución, con techo cerrado.

Agenda un Escaneo — desde USD $550

Esta guía es orientativa y usa comandos de referencia. En producción, adapta a tu versión y prueba en un ambiente seguro primero.