Guía completa sobre la verificación, gestión y optimización de índices en MySQL

目次

1. Introducción

MySQL es una base de datos relacional ampliamente utilizada en muchas aplicaciones web y sistemas de gestión de datos. Para mejorar la velocidad de búsqueda de datos, cuenta con un mecanismo llamado “índice”. Sin embargo, si no se gestiona adecuadamente, puede provocar una degradación del rendimiento.

¿Por qué es importante comprobar los índices?

Los índices en una base de datos son como el índice de un libro. Los índices bien diseñados mejoran la velocidad de ejecución de las consultas de búsqueda. Sin embargo, también pueden surgir los siguientes problemas.

  • Los índices no se crean adecuadamente → Esto puede hacer que las búsquedas se ralenticen
  • Existen índices innecesarios → Esto provoca velocidades de actualización e inserción más lentas
  • No está claro qué índices se están utilizando → Hace imposible decidir qué índices innecesarios eliminar

Lo que puedes aprender de este artículo

  • Mecanismos básicos de los índices de MySQL
  • Métodos para comprobar los índices actuales (usando comandos SQL)
  • Métodos para gestionar y optimizar índices
  • Técnicas para analizar el uso de índices

A partir de ahora, aprendamos de manera sistemática sobre los índices de MySQL y apliquemos este conocimiento para mejorar el rendimiento de la base de datos.

2. ¿Qué es un índice de MySQL?

Los índices son una característica importante para mejorar el rendimiento de la base de datos. Aquí explicamos los conceptos básicos de los índices, sus tipos, ventajas y desventajas.

Conceptos básicos de los índices

Un índice de base de datos es un mecanismo para buscar rápidamente valores en columnas específicas. Por ejemplo, al buscar un registro específico en una tabla con una gran cantidad de datos, sin un índice es necesario escanear todos los registros (escaneo completo de tabla). Aplicar un índice hace que las búsquedas de datos sean eficientes y mejora significativamente la velocidad de procesamiento.

Tipos de índices de MySQL

MySQL tiene varios tipos de índices, cada uno adecuado para usos específicos.

  1. PRIMARY KEY (Índice de clave primaria)
  • Se puede establecer solo una por tabla
  • Garantiza la unicidad de la tabla
  • Funciona como un índice agrupado
  1. UNIQUE (Índice único)
  • Restringe que los valores de la columna especificada se dupliquen
  • Se permiten valores NULL (múltiples NULL son aceptables)
  1. INDEX (Índice general)
  • Se utiliza para acelerar las búsquedas
  • No hay problema incluso con datos duplicados
  1. FULLTEXT (Índice de texto completo) (Para búsqueda de texto)
  • Realiza búsquedas de texto de manera eficiente
  • Se utiliza en combinación con la sintaxis MATCH ... AGAINST
  1. SPATIAL (Índice espacial) (Para información geográfica)
  • Para datos espaciales (datos GIS)

Ventajas y desventajas de los índices

Ventajas

  • La velocidad de búsqueda de consultas mejora
  • El procesamiento de JOIN y el rendimiento de la cláusula WHERE mejoran
  • La recuperación de datos específicos se vuelve eficiente

Desventajas

  • A medida que aumentan los índices, las inserciones, actualizaciones y eliminaciones de datos se ralentizan
  • Consume espacio en disco
  • Si el índice no es apropiado, el rendimiento puede disminuir en su lugar

3. Cómo comprobar los índices en MySQL

Para gestionar los índices de manera adecuada en MySQL, es importante verificar qué índices están configurados en la tabla actual. Esta sección explica cómo comprobar los índices utilizando el comando SHOW INDEX, INFORMATION_SCHEMA.STATISTICS y el comando mysqlshow.

Comando SHOW INDEX (Método básico de comprobación)

En MySQL, al usar el comando SHOW INDEX, puedes obtener una lista de índices configurados en una tabla específica. Este comando te permite comprobar información detallada como el nombre del índice, columnas aplicadas, presencia de restricción única.

Sintaxis básica

SHOW INDEX FROM table_name;

Ejemplo de ejecución

Por ejemplo, para comprobar los índices establecidos en la tabla users, ejecuta la siguiente sentencia SQL.

SHOW INDEX FROM users;

Resultado de ejemplo

Table

Non_unique

Nombre_clave

Secuencia en índice

Nombre_columna

Collation

Cardinalidad

Index_type

usuarios

0

PRIMARIO

1

id

A

1000

Árbol B

usuarios

1

idx_email

1

correo electrónico

A

500

BTREE

Usando INFORMATION_SCHEMA.STATISTICS (Obtener información detallada)

Al usar la tabla del sistema de MySQL INFORMATION_SCHEMA.STATISTICS, puedes obtener la misma información que el comando SHOW INDEX de manera más flexible.

Comprobación de índices para una tabla específica

SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'users';

Obtención de índices para toda la base de datos

SELECT TABLE_NAME, COLUMN_NAME, INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_database_name';

Comando mysqlshow (verificación en entorno CLI)

También es posible obtener información de índices utilizando la herramienta de línea de comandos de MySQL. Es particularmente conveniente cuando se conecta al servidor MySQL mediante SSH.

Método de ejecución del comando

mysqlshow -u username -p password database_name table_name

Ejemplo de ejecución

mysqlshow -u root -p my_database users

Manejo de casos sin índices

Si no se muestran índices incluso después de ejecutar el comando SHOW INDEX o consultar INFORMATION_SCHEMA.STATISTICS, puede indicar que no se han establecido índices adecuados en la tabla. En tales casos, puede mejorar el rendimiento de búsqueda creando índices según sea necesario.

Creación de un nuevo índice

CREATE INDEX idx_column ON users (email);

Establecimiento de la clave primaria (PRIMARY KEY)

ALTER TABLE users ADD PRIMARY KEY (id);

Eliminación de índices innecesarios

ALTER TABLE users DROP INDEX idx_column;

4. Cómo comprobar el uso de índices

Comprobar si los índices funcionan correctamente en MySQL es un paso importante en la optimización del rendimiento de la base de datos. En esta sección, explicaremos cómo comprobar qué índices utiliza una consulta mediante el uso del comando EXPLAIN y el Performance Schema.

Análisis de consultas usando EXPLAIN

El comando EXPLAIN se utiliza para visualizar cómo se ejecuta la consulta SQL especificada. Al analizar los índices utilizados, los métodos de búsqueda, los planes de ejecución, etc., puede verificar si los índices funcionan correctamente.

Sintaxis básica

EXPLAIN SELECT * FROM table_name WHERE condition;

Ejemplo de ejecución

Por ejemplo, al buscar en la tabla users con una condición en la columna email:

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

Ejemplo de resultados de ejecución

id

select_type

table

tipo

possible_keys

clave

key_len

ref

filas

Extra

1

SIMPLE

usuarios

ref

idx_email

idx_email

256

const

1

Usando índice

Puntos clave

  • Si type = ALL, se está realizando un escaneo completo de la tabla, por lo que debe aplicar un índice
  • Si se muestra un nombre de índice en key, ese índice está siendo utilizado
  • Si el valor en rows es demasiado grande, es necesaria la optimización de la consulta

Utilizando Performance Schema

Al usar performance_schema de MySQL, puede analizar en detalle qué índices se están utilizando y en qué medida durante la ejecución de la consulta.

Obtención de estadísticas de ejecución de consultas

SELECT * FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT LIKE '%SELECT%';

Comprobación del uso de índices para una tabla específica

SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME, COUNT_STAR, SUM_TIMER_WAIT
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE OBJECT_SCHEMA = 'your_database_name' AND OBJECT_NAME = 'users';

Soluciones cuando los índices no se están utilizando

1. Revisar la consulta

Si un índice no se está utilizando, puede haber un problema con la forma en que se escribe la consulta. Por ejemplo, en casos como el siguiente, el índice puede no ser utilizado.❌ Escritura incorrecta (el índice se invalida porque se usa una función)

SELECT * FROM users WHERE LOWER(email) = 'test@example.com';

→ Debido a LOWER(email), el índice en la columna email se ignora.✅ Después de la corrección (no se usa función)

SELECT * FROM users WHERE email = 'test@example.com';

2. Recrear el índice

Si el índice existente no funciona correctamente, recrearlo puede mejorar la situación.

ALTER TABLE users DROP INDEX idx_email;
CREATE INDEX idx_email ON users(email);

3. Actualizar estadísticas

Si las estadísticas de la tabla están desactualizadas, el índice puede no usarse de manera óptima. En ese caso, puede actualizar las estadísticas con el siguiente comando.

ANALYZE TABLE users;

5. Gestión de Índices

Los índices de MySQL son elementos importantes que mejoran el rendimiento de búsqueda de datos, pero si no se gestionan correctamente, pueden degradar el rendimiento de la base de datos. Esta sección ofrece una explicación detallada sobre la creación y eliminación de índices, así como la identificación y gestión de índices innecesarios.

Creación de Índices

Al crear índices apropiados, puedes acelerar las búsquedas de datos. En MySQL, puedes añadir índices usando CREATE INDEX o ALTER TABLE.

Sintaxis Básica

CREATE INDEX index_name ON table_name(column_name);

Ejemplo

Al añadir un índice a la columna email de la tabla users:

CREATE INDEX idx_email ON users(email);

Índice de Múltiples Columnas (Índice Compuesto)

CREATE INDEX idx_name_email ON users(last_name, first_name, email);

Índice Único

CREATE UNIQUE INDEX idx_unique_email ON users(email);

Establecer la Clave Primaria (PRIMARY KEY)

ALTER TABLE users ADD PRIMARY KEY (id);

Eliminación de Índices

Al eliminar índices innecesarios, puedes reducir la sobrecarga innecesaria en la base de datos.

Sintaxis Básica

ALTER TABLE table_name DROP INDEX index_name;

Ejemplo

Por ejemplo, al eliminar un índice llamado idx_email:

ALTER TABLE users DROP INDEX idx_email;

Identificación y Eliminación de Índices Innecesarios

Verificación de Índices No Utilizados

SELECT * FROM sys.schema_unused_indexes;

Verificación del Impacto de los Índices

SHOW TABLE STATUS LIKE 'users';

Eliminación de Índices Innecesarios

ALTER TABLE users DROP INDEX idx_unused;

Después de la eliminación, también se recomienda ejecutar ANALYZE TABLE para actualizar las estadísticas.

ANALYZE TABLE users;

6. Optimización de Índices (Mejora del Rendimiento)

Al gestionar adecuadamente los índices, puedes mejorar significativamente el rendimiento de las consultas de MySQL. Sin embargo, más allá de crear índices, al realizar diseño, gestión y monitoreo adecuados, es posible mantener un rendimiento óptimo.

Diseño Apropiado de Índices

Los índices de MySQL, cuando están bien diseñados, pueden mejorar significativamente la velocidad de búsqueda.

Casos en los que se Deben Aplicar Índices

Casos donde aplicar

Razón

Columnas Frecuentemente Utilizadas en Cláusulas WHERE

Buscar rápidamente datos específicos

Claves usadas para JOINs

Mejorar el rendimiento de las uniones

Columnas utilizadas en ORDER BY / GROUP BY

Mejorar la velocidad de clasificación y agregación

Buscar columnas objetivo en conjuntos de datos grandes

Prevenir escaneos completos

Casos en los que es Mejor No Aplicar Índices

Casos en los que es mejor no aplicar

Razón

Tablas pequeñas

Los escaneos completos de tabla son más rápidos

Columnas con actualizaciones y eliminaciones frecuentes

Los costos de actualización de índices aumentan

Baja cardinalidad (pocos valores distintos)

Efectividad limitada (por ejemplo, género, banderas, etc.)

Utilización de Registros de Consultas Lentas

Al usar el Registro de Consultas Lentas, puedes identificar las consultas que tardan mucho en ejecutarse y analizar qué índices no se están aplicando.

Habilitar Registros de Consultas Lentas

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- Record queries that take 2 seconds or more

Verificar Registros de Consultas Lentas

SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;

Analizar Consultas Lentas

EXPLAIN SELECT * FROM users WHERE last_login > '2024-01-01';
Ejemplo de Aplicación de Índice
CREATE INDEX idx_last_login ON users(last_login);

Actualización de Estadísticas (ANALYZE & OPTIMIZE)

ANALYZE TABLE (Actualización de Estadísticas)

ANALYZE TABLE users;

OPTIMIZE TABLE (Desfragmentación)

OPTIMIZE TABLE users;

7. Preguntas Frecuentes sobre Índices (FAQ)

Los índices de MySQL son un mecanismo importante para mejorar el rendimiento de la base de datos, pero si no se gestionan correctamente, pueden tener el efecto contrario. En esta sección, hemos compilado preguntas frecuentes (FAQ) sobre índices de MySQL y sus respuestas.

¿Agregar más índices siempre mejora la velocidad de búsqueda?

A. No necesariamente.

Los índices están diseñados para mejorar la velocidad de las consultas de búsqueda, pero añadir demasiados puede degradar el rendimiento de la base de datos.

  • Aumento de la carga en escrituras (INSERT, UPDATE, DELETE)
  • Si un índice se aplica depende de la consulta
  • Los índices innecesarios consumen memoria

¿En qué columnas debo establecer índices?

A. Es efectivo aplicar índices a columnas como las siguientes.

Columnas a las que aplicar índices

Razón

Columnas que se buscan con frecuencia en cláusulas WHERE

Acelerar las búsquedas de datos

Columnas usadas para JOINs

Optimización de uniones de tablas

Columnas usadas en ORDER BY / GROUP BY

Mejor rendimiento para la clasificación y agregación

¿Se crean índices automáticamente?

A. Algunos índices se crean automáticamente, pero existen casos en los que es necesario agregarlos manualmente.

Índices creados automáticamente

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY, -- PRIMARY KEY index
  email VARCHAR(255) UNIQUE -- Index automatically created by UNIQUE constraint
);

Índices creados manualmente

CREATE INDEX idx_email ON users(email);

¿Cómo diferenciar entre tipos de índices (B-Tree, Hash, Fulltext)?

Tipo de índice

Características

Usos típicos

Índice B-Tree

Búsquedas por rango posibles

Cláusulas WHERE, ORDER BY, JOIN

Índice Hash

Solo búsquedas de igualdad exacta (=)

Búsquedas rápidas

FULLTEXT Index

Dedicado a las búsquedas de texto

Búsquedas de artículos, búsquedas de blogs de texto completo

¿Cómo comprobar el tamaño de un índice?

SHOW TABLE STATUS LIKE 'users';

¿Cómo comprobar si un índice está siendo utilizado?

EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';

¿Cuándo debo eliminar un índice?

Índices a eliminar

Razón

Índices no utilizados

Gasta memoria

Índices duplicados

Inútil si existen índices similares

Eliminación de índices innecesarios

ALTER TABLE users DROP INDEX idx_unused;

8. Resumen

En este artículo, explicamos de manera exhaustiva los índices de MySQL, desde los conceptos básicos hasta los métodos de verificación, la gestión, la optimización y las preguntas frecuentes. Aquí revisaremos los puntos clave de cada sección y resumiremos las mejores prácticas para optimizar la gestión de índices en MySQL.

Revisión de los puntos clave del artículo

¿Qué son los índices de MySQL?

  • Los índices son mecanismos para acelerar las búsquedas de datos.
  • Existen tipos como índices B-Tree, Hash y FULLTEXT .
  • Son efectivos cuando se aplican a columnas utilizadas en cláusulas WHERE, JOIN y ORDER BY.

Cómo comprobar los índices de MySQL

  • Comprueba la lista de índices con el comando SHOW INDEX.
  • Información detallada se puede obtener de INFORMATION_SCHEMA.STATISTICS.

Cómo comprobar el uso de índices

  • Utiliza EXPLAIN para comprobar qué índices está utilizando la consulta.
  • La frecuencia de uso se puede analizar mediante el Performance Schema.

Gestión de índices

  • Establece índices en columnas apropiadas con CREATE INDEX.
  • Elimina índices innecesarios con ALTER TABLE DROP INDEX.
  • Comprueba el tamaño de los índices con SHOW TABLE STATUS y realiza optimización.

Optimización de índices (mejora del rendimiento)

  • Columnas a aplicar: Columnas que se usan con frecuencia en WHERE, JOIN, ORDER BY.
  • Utiliza el registro de consultas lentas para identificar consultas lentas y optimizarlas.
  • Actualiza estadísticas con ANALYZE TABLE y OPTIMIZE TABLE.

Mejores prácticas para la gestión de índices en MySQL

  1. Antes de aplicar índices, identifica qué consultas son cuellos de botella.

  2. Selecciona índices apropiados

  • Distingue adecuadamente entre índices de columna única y índices compuestos.
  • Utiliza UNIQUE INDEX para columnas que requieren restricciones de unicidad.
  1. Elimina regularmente índices innecesarios
  • Identifica índices no utilizados con SHOW INDEX o schema_unused_indexes.
  1. Actualiza regularmente estadísticas
  • Actualiza estadísticas con ANALYZE TABLE.
  • Ejecuta OPTIMIZE TABLE para resolver la fragmentación causada por eliminaciones o actualizaciones.

Próximos pasos

✅ Lista de verificación práctica¿Has revisado los índices actuales con SHOW INDEX?¿Has habilitado el registro de consultas lentas e identificado consultas lentas?¿Has analizado el plan de ejecución de la consulta con EXPLAIN?¿Has eliminado índices innecesarios y creado los adecuados?¿Has ejecutado ANALYZE TABLE para actualizar estadísticas?

Resumen final

  • Una gestión adecuada de los índices de MySQL puede mejorar significativamente el rendimiento de búsqueda.
  • Utiliza el registro de consultas lentas y EXPLAIN para analizar la efectividad de los índices y realizar optimizaciones.
  • Actualiza regularmente las estadísticas y optimiza las tablas para mantener el rendimiento de la base de datos.

Esto concluye la serie de artículos sobre la gestión de índices en MySQL.

Utiliza este conocimiento para lograr operaciones de base de datos más rápidas y eficientes. 💡🚀