Para optimizar el rendimiento de las consultas en una base de datos MySQL, es fundamental comprender cómo están estructurados los índices de nuestras tablas. El comando SHOW INDEX es la herramienta estándar para inspeccionar estos metadatos.
Consideremos la siguiente estructura de tabla para un regsitro de operaciones comerciales, donde definiremos múltiples tipos de índices para ilustrar el comportamiento del comando:
CREATE TABLE historial_ventas_2024 (
id_transaccion INT UNSIGNED NOT NULL AUTO_INCREMENT,
fecha_registro DATE NOT NULL,
id_sucursal INT NOT NULL,
codigo_cliente VARCHAR(50) DEFAULT NULL,
sku_producto VARCHAR(20) DEFAULT NULL,
monto_total DECIMAL(10,2) NOT NULL,
id_vendedor INT UNSIGNED NOT NULL,
PRIMARY KEY (id_transaccion),
KEY idx_fecha (fecha_registro),
KEY idx_sucursal (id_sucursal),
KEY idx_vendedor (id_vendedor),
KEY idx_compuesto (id_sucursal, id_vendedor)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Una vez creada la tabla y sus índices, podemos ejecutar la instrucción de inspección:
SHOW INDEX FROM historial_ventas_2024;
El resultado de esta consulta devuelve un conjunto de columas que describen detalladamente cada índice. A continuación, se detallan los campos más relevantes del resultado según la documentación técnica de MySQL:
- Table: El nombre de la tabla consultada.
- Non_unique: Indica si el índice puede contener duplicados. Devuelve 0 si no permite duplicados (como en una PRIMARY KEY o UNIQUE) y 1 si los permite.
- Key_name: El nombre identificador del índice. Si es la clave primaria, siempre aparecerá como
PRIMARY. - Seq_in_index: La posición de la columna dentro del índice. En índices compuestos (como
idx_compuestoen nuestro ejemplo), el valor será 1 para la primera columna, 2 para la segunda, y así sucesivamente. - Column_name: El nombre de la columna física a la que apunta el índice.
- Colllation: Define cómo se ordenan los datos en el índice. 'A' representa un orden ascendente, mientras que NULL indica que no hay un orden específico.
- Cardinality: Una estimación del número de valores únicos en el índice. MySQL utiliza este valor para decidir qué índice es más eficiente durante una unión (JOIN) o una filtración. Se recomienda ejecutar
ANALYZE TABLEpara mantener este valor actualizado. - Sub_part: Longitud del prefijo indexado. Si se indexa solo una parte de una cadena (por ejemplo, los primeros 10 caracteres), mostrará ese número. Si se indexa la columna completa, el valor será NULL.
- Packed: Describe cómo se comprime la clave. Generalmente es NULL si no hay compresión activa.
- Null: Contiene 'YES' si la columna indexada admite valores NULL, y permanece vacío en caso contrario.
- Index_type: El método de indexación utilizado por el motor de almacenamiento. Los valores comunes incluyen BTREE (el más frecuente en InnoDB), FULLTEXT, HASH o RTREE.
- Comment: Información adicional sobre el índice que no se encuentra en otras columnas.
- Index_comment: Cualquier comentario personalizado que se haya proporcionado mediante el atributo COMMENT al momento de definir el índice.