Performance Insight le ayuda a identificar qué tablas e índices soportan la mayor carga, qué sentencias SQL consumen más tiempo de CPU o de bloqueo, y cómo se comporta su E/S a lo largo del tiempo. Esto le permite aislar la causa raíz de las consultas lentas sin necesidad de hacer suposiciones.
Esta función recopila dos tipos de datos:
Estadísticas de objetos: registra la actividad de lectura y escritura a nivel de tabla e índice. Se almacena en
TABLE_STATISTICSyINDEX_STATISTICSdentro de la base de datosinformation_schema.Punto de rendimiento: registra los tiempos por sentencia en tres dimensiones (CPU, bloqueos y E/S). Se almacena en
events_statements_summary_by_digest_supplementdentro de la base de datosperformance_schema.
Flujo de trabajo de diagnóstico recomendado:
Consulte las estadísticas de objetos para identificar qué tablas o índices presentan la mayor actividad.
Consulte los datos del punto de rendimiento para encontrar las sentencias SQL que generan dicha carga. Compare
CPU_TIMEconELAPSED_TIMEpara clasificar el cuello de botella como limitado por CPU, por bloqueos o por E/S.Consulte las estadísticas de E/S para correlacionar los picos de lectura y escritura con ventanas de tiempo específicas.
Requisitos previos
Antes de empezar, asegúrese de que:
Su instancia RDS ejecute MySQL 8.0 o MySQL 5.7 con una versión menor del motor 20190915 o posterior.
Para comprobar la versión menor del motor, vaya a la página Basic Information en la consola de ApsaraDB RDS. En la sección Configuration Information, busque el botón Upgrade Kernel Version. Si aparece el botón, haga clic en él para ver y actualizar la versión menor del motor. Si el botón no aparece, la instancia ya se encuentra en la última versión menor del motor. Para obtener más detalles, consulte Update the minor engine version.
Uso de estadísticas de objetos
Las estadísticas de objetos permiten detectar tablas con alta actividad e índices poco utilizados. Este es un punto de partida para decidir dónde enfocar la optimización de consultas.
Paso 1: Comprobar que las estadísticas de objetos están habilitadas
Ejecute la siguiente consulta para confirmar que OPT_TABLESTAT y OPT_INDEXSTAT tienen el valor ON:
mysql> SHOW VARIABLES LIKE "opt_%_stat";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| opt_indexstat | ON |
| opt_tablestat | ON |
+---------------+-------+
Paso 2: Consultar estadísticas de tablas
TABLE_STATISTICS registra la actividad de lectura y escritura por tabla. Utilícela para identificar tablas con un número inesperadamente alto de lecturas o modificaciones de filas; estas son candidatas para la optimización de consultas o el ajuste de índices.
mysql> SELECT * FROM TABLE_STATISTICS LIMIT 10;
+--------------+--------------+-----------+--------------+------------------------+---------------+--------------+--------------+
| TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED | ROWS_CHANGED_X_INDEXES | ROWS_INSERTED | ROWS_DELETED | ROWS_UPDATED |
+--------------+--------------+-----------+--------------+------------------------+---------------+--------------+--------------+
| mysql | db | 2 | 0 | 0 | 0 | 0 | 0 |
| mysql | engine_cost | 2 | 0 | 0 | 0 | 0 | 0 |
| mysql | proxies_priv | 1 | 0 | 0 | 0 | 0 | 0 |
| mysql | server_cost | 6 | 0 | 0 | 0 | 0 | 0 |
| mysql | tables_priv | 2 | 0 | 0 | 0 | 0 | 0 |
| mysql | user | 7 | 0 | 0 | 0 | 0 | 0 |
| test | sbtest1 | 1686 | 142 | 184 | 112 | 12 | 18 |
| test | sbtest10 | 1806 | 125 | 150 | 105 | 5 | 15 |
| test | sbtest100 | 1623 | 141 | 182 | 110 | 10 | 21 |
| test | sbtest11 | 1254 | 136 | 172 | 110 | 10 | 16 |
+--------------+--------------+-----------+--------------+------------------------+---------------+--------------+--------------+
Columnas de TABLE_STATISTICS
|
Columna |
Descripción |
|
TABLE_SCHEMA |
Nombre de la base de datos |
|
TABLE_NAME |
Nombre de la tabla |
|
ROWS_READ |
Número de filas leídas de la tabla |
|
ROWS_CHANGED |
Número de filas modificadas en la tabla |
|
ROWS_CHANGED_X_INDEXES |
Número de filas modificadas mediante índices |
|
ROWS_INSERTED |
Número de filas insertadas en la tabla |
|
ROWS_DELETED |
Número de filas eliminadas de la tabla |
|
ROWS_UPDATED |
Número de filas actualizadas en la tabla |
Paso 3: Consultar estadísticas de índices
INDEX_STATISTICS registra cuántas filas se leen a través de cada índice. Un índice con un recuento bajo de ROWS_READ en relación con la actividad de su tabla es candidato para eliminación, ya que quitar índices no utilizados reduce la sobrecarga de escritura.
mysql> SELECT * FROM INDEX_STATISTICS LIMIT 10;
+--------------+--------------+------------+-----------+
| TABLE_SCHEMA | TABLE_NAME | INDEX_NAME | ROWS_READ |
+--------------+--------------+------------+-----------+
| mysql | db | PRIMARY | 2 |
| mysql | engine_cost | PRIMARY | 2 |
| mysql | proxies_priv | PRIMARY | 1 |
| mysql | server_cost | PRIMARY | 6 |
| mysql | tables_priv | PRIMARY | 2 |
| mysql | user | PRIMARY | 7 |
| test | sbtest1 | PRIMARY | 2500 |
| test | sbtest10 | PRIMARY | 3007 |
| test | sbtest100 | PRIMARY | 2642 |
| test | sbtest11 | PRIMARY | 2091 |
+--------------+--------------+------------+-----------+
Columnas de INDEX_STATISTICS
|
Columna |
Descripción |
|
TABLE_SCHEMA |
Nombre de la base de datos |
|
TABLE_NAME |
Nombre de la tabla |
|
INDEX_NAME |
Nombre del índice |
|
ROWS_READ |
Número de filas leídas a través de este índice |
Uso del punto de rendimiento
El punto de rendimiento registra los tiempos por sentencia en events_statements_summary_by_digest_supplement (en la base de datos performance_schema). Cada fila corresponde a un resumen de sentencia y desglosa el tiempo de ejecución en tres dimensiones:
CPU: tiempo total transcurrido y tiempo de CPU consumido por la sentencia.
Bloqueos: tiempo dedicado a esperar bloqueos de metadatos, bloqueos de transacciones, mutex y bloqueos de lectores-escritores.
E/S: tiempo y volumen de lecturas y escrituras en archivos de datos, escrituras en archivos de registro, lecturas de registros binarios, lecturas de registros redo y lecturas asíncronas de registros redo.
Utilice estas dimensiones para clasificar los cuellos de botella: si CPU_TIME es cercano a ELAPSED_TIME, la sentencia está limitada por CPU. Si SERVER_LOCK_TIME o TRANSACTION_LOCK_TIME es alto, la sentencia está limitada por bloqueos. Si DATA_READ_TIME o DATA_WRITE_TIME predomina, la sentencia está limitada por E/S.
Paso 1: Comprobar que el punto de rendimiento está habilitado
Ejecute la siguiente consulta para verificar las variables del punto de rendimiento:
mysql> SHOW VARIABLES LIKE "%performance_point%";
+---------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------+-------+
| performance_point_dbug_enabled | OFF |
| performance_point_enabled | ON |
| performance_point_iostat_interval | 2 |
| performance_point_iostat_volume_size | 10000 |
| performance_point_lock_rwlock_enabled | ON |
+---------------------------------------+-------+
Si estas variables no aparecen, la instancia no cumple con los requisitos de versión indicados en Requisitos previos .
Paso 2: Consultar datos de rendimiento de sentencias SQL
Consulte events_statements_summary_by_digest_supplement para obtener datos de rendimiento por sentencia. Ordene por ELAPSED_TIME para encontrar las sentencias más lentas y luego inspeccione las columnas de desglose. Así podrá identificar qué dimensión (CPU, bloqueos o E/S) representa la mayor parte del tiempo.
mysql> SELECT * FROM events_statements_summary_by_digest_supplement LIMIT 10;
+--------------------+----------------------------------+-------------------------------------------+--------------+
| SCHEMA_NAME | DIGEST | DIGEST_TEXT | ELAPSED_TIME | ......
+--------------------+----------------------------------+-------------------------------------------+--------------+
| NULL | 6b787dd1f9c6f6c5033120760a1a82de | SELECT @@`version_comment` LIMIT ? | 932 |
| NULL | 2fb4341654df6995113d998c52e5abc9 | SHOW SCHEMAS | 2363 |
| NULL | 8a93e76a7846384621567fb4daa1bf95 | SHOW VARIABLES LIKE ? | 17933 |
| NULL | dd148234ac7a20cb5aee7720fb44b7ea | SELECT SCHEMA ( ) | 1006 |
| information_schema | 2fb4341654df6995113d998c52e5abc9 | SHOW SCHEMAS | 2156 |
| information_schema | 74af182f3a2bd265678d3dadb53e08da | SHOW TABLES | 3161 |
| information_schema | d3a66515192fcb100aaef6f8b6e45603 | SELECT * FROM `TABLE_STATISTICS` LIMIT ? | 2081 |
| information_schema | b3726b7c4c4db4b309de2dbc45ff52af | SELECT * FROM `INDEX_STATISTICS` LIMIT ? | 2384 |
| information_schema | dd148234ac7a20cb5aee7720fb44b7ea | SELECT SCHEMA ( ) | 129 |
| test | 2fb4341654df6995113d998c52e5abc9 | SHOW SCHEMAS | 342 |
+--------------------+----------------------------------+-------------------------------------------+--------------+
Columnas de events_statements_summary_by_digest_supplement
|
Columna |
Descripción |
Unidad |
|
SCHEMA_NAME |
Nombre de la base de datos |
— |
|
DIGEST |
Cadena hash de 64 bytes derivada de DIGEST_TEXT |
— |
|
DIGEST_TEXT |
Forma normalizada de la sentencia SQL |
— |
|
ELAPSED_TIME |
Tiempo total de ejecución |
Microsegundos |
|
CPU_TIME |
Tiempo de CPU consumido durante la ejecución |
Microsegundos |
|
SERVER_LOCK_TIME |
Tiempo dedicado a esperar bloqueos de metadatos en el servidor |
Microsegundos |
|
TRANSACTION_LOCK_TIME |
Tiempo dedicado a esperar bloqueos de transacciones de almacenamiento |
Microsegundos |
|
MUTEX_SPINS |
Número de ciclos de mutex activados |
— |
|
MUTEX_WAITS |
Número de esperas en ciclo activadas por mutex |
— |
|
RWLOCK_SPIN_WAITS |
Número de esperas en ciclo activadas por bloqueos de lectores-escritores |
— |
|
RWLOCK_SPIN_ROUNDS |
Número de vueltas que el hilo en segundo plano ejecutó en ciclos de espera de bloqueos de lectores-escritores |
— |
|
RWLOCK_OS_WAITS |
Número de esperas del sistema operativo activadas por bloqueos de lectores-escritores |
— |
|
DATA_READS |
Número de lecturas desde archivos de datos |
— |
|
DATA_READ_TIME |
Tiempo dedicado a leer archivos de datos |
Microsegundos |
|
DATA_WRITES |
Número de escrituras en archivos de datos |
— |
|
DATA_WRITE_TIME |
Tiempo dedicado a escribir en archivos de datos |
Microsegundos |
|
REDO_WRITES |
Número de escrituras en archivos de registro |
— |
|
REDO_WRITE_TIME |
Tiempo dedicado a escribir en archivos de registro |
Microsegundos |
|
LOGICAL_READS |
Número de lecturas lógicas de páginas |
— |
|
PHYSICAL_READS |
Número de lecturas físicas de páginas |
— |
|
PHYSICAL_ASYNC_READS |
Número de lecturas físicas asíncronas de páginas |
— |
Consulta de estadísticas de E/S
IO_STATISTICS (en la base de datos information_schema) registra la actividad de lectura y escritura a intervalos regulares. Utilícela para correlacionar los picos de E/S con ventanas de tiempo donde observó degradación del rendimiento; por ejemplo, para relacionar un pico en DATA_READ con un periodo de respuestas lentas en las consultas.
mysql> SELECT * FROM IO_STATISTICS LIMIT 10;
+---------------------+-----------+----------------+
| TIME | DATA_READ | DATA_READ_TIME | ......
+---------------------+-----------+----------------+
| 2019-08-08 09:56:53 | 73 | 983 |
| 2019-08-08 09:56:57 | 0 | 0 |
| 2019-08-08 09:59:17 | 0 | 0 |
| 2019-08-08 10:00:55 | 4072 | 40628 |
| 2019-08-08 10:00:59 | 0 | 0 |
| 2019-08-08 10:01:09 | 562 | 5800 |
| 2019-08-08 10:01:11 | 606 | 6910 |
| 2019-08-08 10:01:13 | 609 | 6875 |
| 2019-08-08 10:01:15 | 625 | 7077 |
| 2019-08-08 10:01:17 | 616 | 5800 |
+---------------------+-----------+----------------+
Columnas de IO_STATISTICS
|
Columna |
Descripción |
Unidad |
|
TIME |
Marca de tiempo del intervalo |
— |
|
DATA_READ |
Número de operaciones de lectura de datos |
— |
|
DATA_READ_TIME |
Tiempo total dedicado a leer datos |
Microsegundos |
|
DATA_READ_MAX_TIME |
Tiempo máximo de una sola operación de lectura |
Microsegundos |
|
DATA_READ_BYTES |
Total de datos leídos |
Bytes |
|
DATA_WRITE |
Número de operaciones de escritura de datos |
— |
|
DATA_WRITE_TIME |
Tiempo total dedicado a escribir datos |
Microsegundos |
|
DATA_WRITE_MAX_TIME |
Tiempo máximo de una sola operación de escritura |
Microsegundos |
|
DATA_WRITE_BYTES |
Total de datos escritos |
Bytes |