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;| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Index_type |
|---|---|---|---|---|---|---|---|
| productos | 0 | PRIMARY | 1 | id | A | 30 | BTREE |
| productos | 1 | categoria_id | 1 | categoria_id | A | 11 | BTREE |
Non_unique: 0 = índice único, 1 = permite duplicadosKey_name: nombre del índice (PRIMARYpara la clave primaria)Seq_in_index: posición de la columna en índices compuestosCollation: A = ascendente, D = descendente, NULL = sin ordenarCardinality: número estimado de valores únicos
SHOW INDEXES FROM pedidos;| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Index_type |
|---|---|---|---|---|---|---|---|
| pedidos | 0 | PRIMARY | 1 | id | A | 25 | BTREE |
| pedidos | 1 | cliente_id | 1 | cliente_id | A | 16 | BTREE |
| pedidos | 1 | empleado_id | 1 | empleado_id | A | 3 | BTREE |
SHOW INDEXES FROM clientes;| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Index_type |
|---|---|---|---|---|---|---|---|
| clientes | 0 | PRIMARY | 1 | id | A | 20 | BTREE |
| clientes | 0 | 1 | A | 20 | BTREE |
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;| tabla | indice | columna | no_unico | cardinalidad |
|---|---|---|---|---|
| categorias | PRIMARY | id | 0 | 16 |
| categorias | categoria_padre_id | categoria_padre_id | 1 | 6 |
| clientes | PRIMARY | id | 0 | 20 |
| clientes | 0 | 20 | ||
| detalle_pedidos | PRIMARY | id | 0 | 41 |
| detalle_pedidos | pedido_id | pedido_id | 1 | 25 |
| detalle_pedidos | producto_id | producto_id | 1 | 22 |
| empleados | PRIMARY | id | 0 | 10 |
| empleados | supervisor_id | supervisor_id | 1 | 5 |
| etiquetas_producto | PRIMARY | id | 0 | 29 |
| etiquetas_producto | producto_id | producto_id | 1 | 18 |
| pedidos | PRIMARY | id | 0 | 25 |
| pedidos | cliente_id | cliente_id | 1 | 16 |
| pedidos | empleado_id | empleado_id | 1 | 3 |
| productos | PRIMARY | id | 0 | 30 |
| productos | categoria_id | categoria_id | 1 | 11 |
| resenas | PRIMARY | id | 0 | 20 |
| resenas | producto_id | producto_id | 1 | 15 |
| resenas | cliente_id | cliente_id | 1 | 18 |
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;| tabla | num_indices |
|---|---|
| pedidos | 3 |
| detalle_pedidos | 3 |
| resenas | 3 |
| clientes | 2 |
| productos | 2 |
| empleados | 2 |
| categorias | 2 |
| etiquetas_producto | 2 |
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:
| Cardinalidad | Significado | Utilidad del índice |
|---|---|---|
| Alta (cercana a total de filas) | Muchos valores únicos | Muy útil |
| Baja (pocos valores) | Pocos valores distintos | Poco útil |
| 1 | Todos los valores iguales | Inú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;| Table | Op | Msg_type | Msg_text |
|---|---|---|---|
| tienda_mysql.productos | analyze | status | OK |
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
