¿Cómo soluciono los problemas de una consulta lenta y mejoro su rendimiento en Amazon RDS para MySQL?
Quiero solucionar problemas relacionados con una consulta lenta y mejorar su rendimiento en Amazon Relational Database Service (Amazon RDS) para MySQL.
Descripción corta
En Amazon RDS, los siguientes problemas pueden provocar un rendimiento lento de las consultas:
- Problemas con la carga de trabajo y el uso de los recursos, como la indexación inadecuada y el uso ineficiente de los grupos de almacenamiento intermedio
- Plan de ejecución de consultas ineficiente
- Contención de recursos
- Bloqueo de transacciones
Para resolver estos problemas, revisa las métricas de Amazon CloudWatch, Información de rendimiento, Database Insights y Supervisión mejorada para identificar los cuellos de botella en el rendimiento. A continuación, resuelve el problema del cuello de botella y optimiza el rendimiento de las consultas.
Resolución
Importante: Información de rendimiento llegará al final de su ciclo de vida el 30 de noviembre de 2026. Puedes actualizar al modo avanzado de Database Insights antes del 30 de noviembre de 2026. Si no actualizas, los clústeres de bases de datos que utilizan Información de rendimiento adoptarán de forma predeterminada el modo estándar de Database Insights. Solo el modo avanzado de Database Insights admitirá los planes de ejecución y el análisis bajo demanda. Si los clústeres utilizan el modo estándar de forma predeterminada, es posible que no puedas usar estas características en la consola. Para activar el modo avanzado, consulta Activación del modo avanzado de Database Insights para Amazon RDS y Activación del modo avanzado de Database Insights para Amazon Aurora.
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Supervisión del rendimiento de los recursos y bases de datos
Para solucionar problemas de rendimiento de las consultas, revisa las métricas de Amazon CloudWatch para determinar la causa del problema. Para determinar cuándo una consulta aumenta el uso de un recurso específico o disminuye el rendimiento de la base de datos, usa la consola de CloudWatch o la AWS CLI para supervisar las siguientes métricas:
- DatabaseConnections
- NetworkReceiveThroughput
- WriteThroughput
- ReadThroughput
- WriteLatency
- ReadLatency
- WriteIOPS
- ReadIOPS
- FreeStorageSpace
- BurstBalance
Si el rendimiento de la base de datos es deficiente, comprueba el estado de la instancia de base de datos de RDS para ver si hay procesos activos o programados que puedan afectar al rendimiento. Además, revisa los eventos de Amazon RDS para ver si hay eventos que puedan afectar al rendimiento de la base de datos.
Revisión de la carga de trabajo y el uso de recursos
Si el rendimiento de las consultas es lento, revisa las demás consultas de tu carga de trabajo para ver si afectan al rendimiento de las consultas. Para identificar las consultas que debes optimizar, puedes activar el modo avanzado de Database Insights para Amazon RDS o Amazon Aurora.
Si la instancia se reinicia, la instancia de base de datos podría perder los datos de la caché y reducir el rendimiento de las consultas. Para evitar este problema de caché en frío, configura los siguientes parámetros para acelerar la activación del conjunto de búferes después de un reinicio:
- innodb_buffer_pool_dump_at_shutdown
- innodb_buffer_pool_load_at_startup
- innodb_buffer_pool_dump_pct
Para optimizar el rendimiento de las consultas, se recomienda supervisar en qué medida la instancia de base de datos utiliza el grupo de búferes de InnoDB. Para obtener más información, consulta Buffer pool (Grupo de búferes) en el sitio web de MySQL. Para supervisar el estado del grupo de búferes de InnoDB, revisa los siguientes contadores de bases de datos de Información de rendimiento:
- Para conocer el número de solicitudes de lectura lógica, revisa el contador Innodb_buffer_pool_read_requests.
- Para ver la cantidad de lecturas lógicas que InnoDB no puede satisfacer desde el grupo de búferes y tuvo que leer directamente desde el disco, revisa las lecturas de Innodb_buffer_pool_reads.
- Usa Innodb_buffer_pool_hit_ratio para determinar el porcentaje de lecturas que InnoDB puede satisfacer desde el grupo de búferes.
- Revisa Innodb_buffer_pool_usage para ver el porcentaje del grupo de búferes de InnoDB que contiene páginas de datos.
Para identificar las consultas que se ejecutan con lentitud, también puedes activar slow_query_log en el grupo de parámetros y publicar los registros en Registros de CloudWatch.
Optimización del rendimiento de las consultas
Para optimizar el rendimiento de las consultas, ejecuta los siguientes comandos en función de las necesidades de tu plan de ejecución de consultas. Para obtener más información, consulta EXPLAIN output format (Formato de salida EXPLAIN) en el sitio web de MySQL.
Uso de EXPLAIN para optimizar tus consultas
Para ver los detalles sobre el rendimiento de la consulta y los motivos por los que la consulta podría retrasarse, ejecuta el comando EXPLAIN. Para obtener más información, consulta Optimizing queries with EXPLAIN (Optimización de consultas con EXPLAIN) en el sitio web de MySQL.
Para determinar si la consulta usa un índice, ejecuta la consulta EXPLAIN. En el resultado EXPLAIN, revisa los nombres de las tablas, las claves que están en uso y el número de filas que escaneó la consulta. Para más información, consulta EXPLAIN statement (Instrucción EXPLAIN) en el sitio web de MySQL. Revisa el resultado y, a continuación, lleva a cabo las siguientes acciones:
- Si el resultado no muestra claves en uso, crea un índice en las columnas en la cláusula WHERE.
- Si la tabla tiene la indexación necesaria, asegúrate de que las estadísticas de la tabla estén actualizadas. Para más información, consulta The INFORMATION_SCHEMA STATISTICS Table (La tabla INFORMATION_SCHEMA STATISTICS) en el sitio web de MySQL.
Uso de ANALYZE TABLE para actualizar las estadísticas de la consulta
Si las estadísticas de la tabla no están actualizadas, es posible que la consulta tenga un rendimiento deficiente. Para actualizar las estadísticas de la consulta, ejecuta el comando ANALYZE TABLE. Para obtener más información, consulta ANALYZE TABLE statement (Instrucción ANALYZE TABLE) en el sitio web de MySQL.
Usa EXPLAIN ANALYZE para ver cómo asignan tiempo tus consultas
Para determinar qué parte de la ejecución de la consulta es lenta, ejecuta la consulta EXPLAIN ANALYZE para ver cómo MySQL asigna el tiempo a tu consulta. Cuando se completa la consulta, la consulta EXPLAIN ANALYZE imprime el plan y sus medidas. Para obtener más información, consulta Obtaining information with EXPLAIN ANALYZE (Obtención de información con EXPLAIN ANALYZE) en el sitio web de MySQL. También puedes usar SHOW PROFILE para perfilar tus consultas más lentas y encontrar el estado en el que la sesión pasa más tiempo. Para obtener más información, consulta SHOW PROFILE statement (Instrucción SHOW PROFILE) en el sitio web de MySQL.
Uso de SHOW FULL PROCESSLIST y Supervisión mejorada para revisar las operaciones
Ejecuta el comando SHOW FULL PROCESSLIST para ver la lista de operaciones que se realizan en el servidor de base de datos. También puedes usar Supervisión mejorada para revisar esta lista. Para obtener más información, consulta SHOW PROCESSLIST statement (Instrucción SHOW PROCESSLIST) en el sitio web de MySQL.
Comprobación de la longitud de la lista de historial
El sistema de transacciones InnoDB mantiene el control de concurrencia multiversión (MVCC). Si tu carga de trabajo exige varias transacciones abiertas o de larga duración, puedes esperar ver una longitud de la lista de historial alta en la base de datos. Se recomienda evitar transacciones abiertas o de larga duración en la base de datos. Para obtener más información, consulta La longitud de la lista del historial de InnoDB aumentó significativamente.
Si no supervisas el tamaño de la longitud de la lista de historial, el rendimiento puede disminuir con el tiempo. Una longitud de la lista de historial alta también puede provocar una alta utilización de recursos, un rendimiento lento e incoherente de la instrucción SELECT y un aumento del almacenamiento.
Nota: Las transacciones de larga duración no son la única causa de los picos de longitud de la lista de historial. Si los subprocesos de purga no pueden relacionar los cambios de la base de datos, la longitud de la lista del historial sigue siendo alta. En casos extremos, también puede producirse una interrupción de la base de datos.
El comando SHOW ENGINE INNODB STATUS muestra información sobre el procesamiento de transacciones, los eventos de espera y los interbloqueos. Para obtener más información, consulta SHOW ENGINE statement (Instrucción SHOW ENGINE) en el sitio web de MySQL. Ejecuta la consulta SHOW ENGINE INNODB STATUS para comprobar la longitud de tu lista de historial:
SHOW ENGINE INNODB STATUS;
Resultado de ejemplo:
\------------ TRANSACTIONS ------------Trx id counter 26368570695 Purge done for trx's n:o < 26168770192 undo n:o < 0 state: running but idle History list length 1839
Para usar Información de rendimiento para comprobar la longitud de la lista de historial, sigue estos pasos:
- Abre la consola de Amazon RDS.
- En el panel de navegación, elige Información de rendimiento y, a continuación, selecciona la base de datos de la que quieres ver las métricas.
- Selecciona Métricas.
- En el menú del panel de métricas, selecciona Panel personalizado.
- Elige Añadir un widget y, a continuación, selecciona la métrica Trx Rseg History Len.
- Selecciona Añadir un widget.
Nota: Si las escrituras en el lenguaje de manipulación de datos (DML) hacen que aumente la longitud de la lista del historial, pide al administrador de la base de datos que finalice las consultas de escritura.
Resolución de las consultas bloqueadas
Si la consulta se ejecuta durante un período de tiempo prolongado, es posible que una consulta diferente la esté bloqueando. En MySQL 8.0, puedes encontrar las esperas de bloqueo en el esquema de rendimiento de la tabla data_lock_waits. Para obtener más información, consulta Using InnoDB transaction and locking information (Uso de la información de transacciones y bloqueos de InnoDB) en el sitio web de MySQL. Ejecuta la siguiente consulta para identificar las transacciones bloqueadas:
SELECT r.trx\_id waiting\_trx\_id, r.trx\_mysql\_thread\_id waiting\_thread, r.trx\_query waiting\_query, b.trx\_id blocking\_trx\_id, b.trx\_mysql\_thread\_id blocking\_thread, b.trx\_query blocking\_query FROM performance\_schema.data\_lock\_waits w INNER JOIN information\_schema.innodb\_trx b ON b.trx\_id = w.blocking\_engine\_transaction\_id INNER JOIN information\_schema.innodb\_trx r ON r.trx\_id = w.requesting\_engine\_transaction\_id;
Información relacionada
- Idioma
- Español
Vídeos relacionados


Contenido relevante
- preguntada hace un año
- preguntada hace 6 meses
OFICIAL DE AWSActualizada hace 5 meses