- 1 1. Introducción
- 2 2. ¿Qué es un índice de MySQL?
- 3 3. Cómo comprobar los índices en MySQL
- 4 4. Cómo comprobar el uso de índices
- 5 5. Gestión de Índices
- 6 6. Optimización de Índices (Mejora del Rendimiento)
- 7 7. Preguntas Frecuentes sobre Índices (FAQ)
- 7.1 ¿Agregar más índices siempre mejora la velocidad de búsqueda?
- 7.2 ¿En qué columnas debo establecer índices?
- 7.3 ¿Se crean índices automáticamente?
- 7.4 ¿Cómo diferenciar entre tipos de índices (B-Tree, Hash, Fulltext)?
- 7.5 ¿Cómo comprobar el tamaño de un índice?
- 7.6 ¿Cómo comprobar si un índice está siendo utilizado?
- 7.7 ¿Cuándo debo eliminar un índice?
- 8 8. Resumen
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.
- PRIMARY KEY (Índice de clave primaria)
- Se puede establecer solo una por tabla
- Garantiza la unicidad de la tabla
- Funciona como un índice agrupado
- UNIQUE (Índice único)
- Restringe que los valores de la columna especificada se dupliquen
- Se permiten valores NULL (múltiples NULL son aceptables)
- INDEX (Índice general)
- Se utiliza para acelerar las búsquedas
- No hay problema incluso con datos duplicados
- 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
- 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
rowses 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
EXPLAINpara 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 STATUSy 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 TABLEyOPTIMIZE TABLE.
Mejores prácticas para la gestión de índices en MySQL
Antes de aplicar índices, identifica qué consultas son cuellos de botella.
Selecciona índices apropiados
- Distingue adecuadamente entre índices de columna única y índices compuestos.
- Utiliza
UNIQUE INDEXpara columnas que requieren restricciones de unicidad.
- Elimina regularmente índices innecesarios
- Identifica índices no utilizados con
SHOW INDEXoschema_unused_indexes.
- Actualiza regularmente estadísticas
- Actualiza estadísticas con
ANALYZE TABLE. - Ejecuta
OPTIMIZE TABLEpara 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. 💡🚀


