SHOW INDEXES

SHOW INDEXES muestra información detallada sobre los índices de una tabla: nombre, columnas, tipo, cardinalidad y si es único. Es fundamental para analizar el rendimiento y entender qué índices existen antes de crear nuevos.

Sintaxis

SHOW INDEXES FROM tabla;
 
-- Sinónimos (todos hacen lo mismo)
SHOW INDEX FROM tabla;
SHOW KEYS FROM tabla;
 
-- Filtrar con WHERE
SHOW INDEXES FROM tabla WHERE Key_name = 'PRIMARY';

Ver índices de tienda_mysql

SHOW INDEXES FROM productos;
TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollationCardinalityIndex_type
productos0PRIMARY1idA30BTREE
productos1categoria_id1categoria_idA11BTREE
  • Non_unique: 0 = índice único, 1 = permite duplicados
  • Key_name: nombre del índice (PRIMARY para la clave primaria)
  • Seq_in_index: posición de la columna en índices compuestos
  • Collation: A = ascendente, D = descendente, NULL = sin ordenar
  • Cardinality: número estimado de valores únicos
SHOW INDEXES FROM pedidos;
TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollationCardinalityIndex_type
pedidos0PRIMARY1idA25BTREE
pedidos1cliente_id1cliente_idA16BTREE
pedidos1empleado_id1empleado_idA3BTREE
SHOW INDEXES FROM clientes;
TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollationCardinalityIndex_type
clientes0PRIMARY1idA20BTREE
clientes0email1emailA20BTREE

El índice email tiene Non_unique = 0 porque fue creado con la restricción UNIQUE.

Usar information_schema

Para consultas más flexibles, usa information_schema.STATISTICS:

SELECT
    TABLE_NAME AS tabla,
    INDEX_NAME AS indice,
    COLUMN_NAME AS columna,
    NON_UNIQUE AS no_unico,
    CARDINALITY AS cardinalidad
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'tienda_mysql'
ORDER BY TABLE_NAME, INDEX_NAME;
tablaindicecolumnano_unicocardinalidad
categoriasPRIMARYid016
categoriascategoria_padre_idcategoria_padre_id16
clientesPRIMARYid020
clientesemailemail020
detalle_pedidosPRIMARYid041
detalle_pedidospedido_idpedido_id125
detalle_pedidosproducto_idproducto_id122
empleadosPRIMARYid010
empleadossupervisor_idsupervisor_id15
etiquetas_productoPRIMARYid029
etiquetas_productoproducto_idproducto_id118
pedidosPRIMARYid025
pedidoscliente_idcliente_id116
pedidosempleado_idempleado_id13
productosPRIMARYid030
productoscategoria_idcategoria_id111
resenasPRIMARYid020
resenasproducto_idproducto_id115
resenascliente_idcliente_id118

Contar índices por tabla

SELECT
    TABLE_NAME AS tabla,
    COUNT(DISTINCT INDEX_NAME) AS num_indices
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'tienda_mysql'
GROUP BY TABLE_NAME
ORDER BY num_indices DESC;
tablanum_indices
pedidos3
detalle_pedidos3
resenas3
clientes2
productos2
empleados2
categorias2
etiquetas_producto2

Interpretar la cardinalidad

La cardinalidad es una estimación del número de valores únicos en el índice. Es fundamental para que el optimizador decida si usar el índice:

CardinalidadSignificadoUtilidad del índice
Alta (cercana a total de filas)Muchos valores únicosMuy útil
Baja (pocos valores)Pocos valores distintosPoco útil
1Todos los valores igualesInútil
-- Ver cardinalidad vs total de filas
SELECT
    s.TABLE_NAME AS tabla,
    s.INDEX_NAME AS indice,
    s.COLUMN_NAME AS columna,
    s.CARDINALITY AS cardinalidad,
    t.TABLE_ROWS AS filas,
    ROUND(s.CARDINALITY / t.TABLE_ROWS * 100, 1) AS selectividad_pct
FROM information_schema.STATISTICS s
JOIN information_schema.TABLES t
    ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME
WHERE s.TABLE_SCHEMA = 'tienda_mysql'
  AND s.INDEX_NAME != 'PRIMARY'
ORDER BY selectividad_pct;

Un índice con selectividad cercana a 100% es muy efectivo. Un índice con selectividad baja (como 10-20%) puede no ser usado por el optimizador.

Actualizar estadísticas

La cardinalidad es una estimación que puede quedar desactualizada después de muchos INSERT/UPDATE/DELETE:

-- Actualizar las estadísticas del índice
ANALYZE TABLE productos;
TableOpMsg_typeMsg_text
tienda_mysql.productosanalyzestatusOK

ANALYZE TABLE recalcula las estadísticas de los índices, lo que ayuda al optimizador a tomar mejores decisiones.

En el siguiente artículo veremos los índices de prefijo, que permiten indexar solo los primeros N caracteres de una columna.

Escrito por Eduardo Lázaro