Para mejorar Rendimiento de MySQL Utilizo el esquema de rendimiento para analizar directamente con SQL los datos de tiempo de ejecución, las esperas, los bloqueos, la memoria y las operaciones de E/S. De este modo, identifico más rápidamente las causas que provocan la lentitud de las sentencias y tomo medidas específicas para Sintonización y seguimiento a partir de [2][3][15].
Puntos centrales
Los siguientes puntos clave me ayudan a utilizar el esquema de rendimiento de forma eficaz.
- Activación y una configuración sencilla con los instrumentos y dispositivos adecuados
- Resúmenes de declaraciones utilizar para detectar patrones costosos y puntos críticos
- Eventos de espera, analizar conjuntamente los bloqueos y las E/S para detectar los verdaderos cuellos de botella
- Esquema del sistema como abreviatura de «perspectivas rápidas y prácticas»
- Iterativo Proceso: medir, aislar, modificar, volver a medir
Activar el esquema de rendimiento y configurarlo adecuadamente
Primero compruebo si performance_schema está activada, ya que las versiones actuales de MySQL suelen venir de fábrica con ella activada [1][12]. Si no está, la configuro en el [mysqld]-Bloque de la my.cnf la variable performance_schema=ON y reinicio el servidor. A continuación, configuro los instrumentos y los consumidores de forma específica, en lugar de dejarlo todo al máximo de forma permanente. Me centro en declaración/%, wait/% y las rutas de E/S pertinentes, para poder recopilar datos significativos sin una sobrecarga innecesaria [6]. Para una nueva serie de mediciones, borro las tablas de historial correspondientes y empiezo con una Base.
Resultados rápidos con el esquema Sys
Para tener una visión general rápida, suelo recurrir a sys-Schema, ya que condensa de forma útil los datos brutos del Performance Schema [13]. Así puedo identificar en cuestión de minutos las consultas que más contribuyen al tiempo de ejecución. Empiezo por las sentencias más importantes, compruebo las vistas de E/S de archivos y examino los resúmenes de esperas de los hilos. En cuanto detecto un punto crítico, vuelvo a las tablas sin procesar y afino el análisis. Quien revise los planes de consulta, podrá, con las medidas adecuadas, Consejos para el Optimizer que a menudo se notan en poco tiempo Ganancias lograr.
Elegir los instrumentos y los consumidores adecuados
Empiezo con un enfoque amplio, pero mantengo la observación bajo control: en primer lugar, activo los más importantes Instrumentos para sentencias, esperas y E/S; después, desactivo todo lo que no aporte información [6]. Los componentes como el historial de eventos y las tablas de resumen deben respaldar las preguntas que quiero responder. Si, por ejemplo, se trata de picos de latencia, consulto resumen_esperas_eventos_globales_por_nombre_de_evento y compáralo con resumen_de_declaraciones_sobre_eventos_por_resumen. Si se producen tiempos de espera de E/S, compruebo resumen_de_archivos_por_nombre_de_evento y resumen_de_esperas_de_E/S_por_tabla. Esta selección específica reduce los gastos generales al mínimo y, aun así, ofrece resultados fiables Datos.
Resúmenes de sentencias: detectar patrones, reducir la carga
Con los resúmenes de sentencias puedo ver qué patrones resultan costosos a largo plazo, incluso aunque las consultas individuales contengan literales variables [17]. Ordeno los resultados por tiempo total, número de ejecuciones y latencia media para establecer prioridades. Para ello, recurro además al Analizar el registro de consultas lentas para no pasar por alto valores atípicos poco frecuentes. Cuando los resúmenes muestran picos, compruebo los índices, las estrategias de JOIN y el orden de los filtros con EXPLICAR. A continuación, compruebo el resultado realizando nuevas mediciones en el esquema de rendimiento, para que las optimizaciones sigan siendo cuantificables.
Interpretar eventos de espera, bloqueos y E/S
Cuando hay consultas en espera, consulto las tablas «Wait» y «Lock» para determinar la verdadera Causa se puede consultar [3]. Si hay muchos subprocesos ejecutándose en las mismas tablas, esto indica table_lock-Espero a que surja la competencia. Si los eventos de E/S de archivos muestran latencias elevadas, compruebo el almacenamiento y el almacenamiento en caché, así como los patrones de consulta con escaneos de gran volumen. Si detecto bloqueos de fila en InnoDB, analizo los registros más activos, la duración de las transacciones y la cobertura de los índices. Solo cuando todas estas piezas del rompecabezas encajan, me pongo a ajustar los parámetros del servidor, el esquema o el código.
Supervisión de la memoria: memoria y pool de búferes
Para solucionar los problemas de memoria, analizo conjuntamente las tablas de memoria y la utilización del búfer de InnoDB. Si aumenta la demanda de memoria de algún componente concreto, ajusto los límites y compruebo si las cachés retienen datos erróneos. Si la caché de InnoDB no es suficiente, aumento su proporción o mejoro la localidad de las consultas. Quien quiera profundizar más, puede hacerlo a través de Optimizar el grupo de búferes lograr mejoras significativas en la latencia. Confirmo el efecto con los Resumen-Tablas y comprueba si los aciertos LRU y los tiempos de espera de E/S van por buen camino.
Flujo de trabajo de diagnóstico iterativo para el día a día
Siempre trabajo con ciclos bien definidos para no perder tiempo y que los cambios sigan siendo cuantificables [3]. En primer lugar, reproduzco el problema bajo una carga controlada. A continuación, recopilo los valores de medición en unas pocas tablas específicas y aíslo los candidatos más destacados. A continuación, modifico aquello que promete un mayor beneficio: índice, consulta, parámetro o código. Por último, vuelvo a medir y documento brevemente Antes/después-Tablas, para que el equipo pueda ver el efecto de inmediato.
Ejemplos de consultas: de los datos brutos a las decisiones
Para las consultas más habituales, he recopilado fragmentos de código SQL concisos que utilizo directamente en mi día a día. La tabla muestra ejemplos que utilizo con frecuencia y para qué sirven. Adapto filtros como LÍMITE o ORDER BY dependiendo del caso concreto. Lo importante es lo siguiente: primero la hipótesis, luego un análisis específico y, por último, una decisión clara. De este modo, mantengo el análisis centrado y evito lo superfluo Carga.
| Tabla(s) de esquemas de rendimiento | Objetivo | Columnas importantes | Consulta de ejemplo |
|---|---|---|---|
resumen_de_declaraciones_sobre_eventos_por_resumen | Encontrar muestras caras | texto_resumen, count_star, sum_timer_wait | SELECT digest_text, count_star, sum_timer_wait/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_digest ORDER BY sec_total DESC LIMIT 10; |
resumen_esperas_eventos_globales_por_nombre_de_evento | Puntos críticos de espera | nombre_del_evento, sum_timer_wait | SELECT event_name, sum_timer_wait/1e12 AS sec_total FROM performance_schema.events_waits_summary_global_by_event_name ORDER BY sec_total DESC LIMIT 10; |
resumen_de_esperas_de_E/S_por_tabla | Comprobar la E/S de las tablas | esquema_de_objetos, nombre_del_objeto, read_timer_wait | SELECT object_schema, object_name, (read_timer_wait+write_timer_wait)/1e12 AS sec_total FROM performance_schema.table_io_waits_summary_by_table ORDER BY sec_total DESC LIMIT 10; |
resumen_de_memoria_global_por_nombre_de_evento | Detectar aplicaciones que consumen mucha memoria | nombre_del_evento, current_alloc | SELECT event_name, current_alloc/1024/1024 AS mb FROM performance_schema.memory_summary_global_by_event_name ORDER BY mb DESC LIMIT 10; |
Planta de producción: minimizar los gastos generales, maximizar el rendimiento
En el modo en directo, no activo instrumentos a ciegas, sino que solo elijo aquellos que responden a mi pregunta [6]. Trato con cautela los eventos de alta frecuencia y mantengo breves las ventanas del historial. Para observaciones más prolongadas, prefiero los resúmenes comprimidos y guardo instantáneas en un archivo externo. Presto atención a la entrada en performance_schema_setup_consumers, para poder controlar las colecciones en lugar de dejar que se desarrollen por sí solas. Este enfoque mantiene el análisis eficiente y protege el servidor.
Ajuste preciso: instrumentos y dispositivos de configuración en la práctica
Para obtener rápidamente resultados fiables, configuro los instrumentos y los consumidores de forma específica. Son especialmente importantes declaración/%, wait/%, wait/io/% y —si es necesario— seleccionados memory/%-Rutas. En un primer momento, solo activo lo estrictamente necesario y luego amplío el análisis si aún me quedan preguntas concretas sin respuesta. Los temporizadores del esquema de rendimiento miden en picosegundos; para obtener valores en segundos, divido las columnas de latencia entre 1e12.
Punto de partida habitual en tiempo de ejecución:
-- Activar los instrumentos clave
UPDATE performance_schema.setup_instruments
SET ENABLED='YES', TIMED='YES'
WHERE NAME LIKE 'statement/%'
OR NAME LIKE 'wait/io/%'
OR NAME LIKE 'wait/lock/%';
-- Seleccionar consumidores importantes
UPDATE performance_schema.setup_consumers
SET ENABLED='YES'
WHERE NAME IN ('global_instrumentation',
'thread_instrumentation',
'statements_digest',
'events_statements_current',
'events_statements_history',
'events_waits_current',
'events_waits_history');
-- Vaciar los resúmenes para obtener una nueva serie de mediciones
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
TRUNCATE TABLE performance_schema.events_waits_summary_global_by_event_name;
TRUNCATE TABLE performance_schema.table_io_waits_summary_by_table; Cuando necesito realizar análisis de memoria, los activo de forma selectiva memory/%-Instrumentos. Esto supone más gastos generales, pero merece la pena en caso de fugas o de una fuerte carga sobre el asignador.
Dimensiones: comprender el usuario, el host y el esquema
Los picos de potencia no suelen ser globales, sino que se producen en determinados Usuario, Anfitriones o un Esquema limitado. El esquema de rendimiento proporciona resúmenes por cuenta y por host. Además, en el resumen incluyo la columna nombre_del_esquema, para delimitar los puntos críticos por base de datos.
Ejemplos que utilizo con frecuencia:
- Esquemas principales según la duración total:
SELECT schema_name, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_digest GROUP BY schema_name ORDER BY sec_total DESC LIMIT 10; - Usuarios/servidores que generan mayor latencia (por cuentas):
SELECT user, host, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_account_by_event_name GROUP BY usuario, host ORDER BY sec_total DESC LIMIT 10; - Hilos con mayor tiempo de espera:
SELECT thread_id, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_waits_summary_by_thread_by_event_name GROUP BY thread_id ORDER BY sec_total DESC LIMIT 10;
Con estas vistas, separo de forma selectiva segmentos de tráfico y puedo limitar el ancho de banda, almacenar en caché o introducir variantes de consultas para cada cliente.
Hacer visibles las transacciones largas y los bloqueos de metadatos
Las transacciones que duran mucho tiempo o que están inactivas bloquean los puntos de control, la purga y las operaciones DML concurrentes. Por eso, compruebo periódicamente la vista de transacciones y las esperas de MDL:
- Transacciones activas:
SELECT thread_id, timer_wait/1e12 AS sec_running, state FROM performance_schema.events_transactions_current ORDER BY sec_running DESC LIMIT 10; - Detectar bloqueos de metadatos (concurrencia DDL/DML):
SELECT event_name, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_waits_summary_global_by_event_name WHERE event_name LIKE 'wait/lock/metadata/sql/mdl%' GROUP BY event_name ORDER BY sec_total DESC;
Si predomina el MDL, rediseño las ventanas DDL, minimizo los tiempos de retención de bloqueos en el código (transacciones más cortas) y compruebo si hay AUTOCOMMIT=0-Mantener abiertas las sesiones durante un tiempo innecesariamente prolongado.
La replicación, las copias de seguridad y los efectos secundarios, todo bajo control
Los procesos de replicación y copia de seguridad aparecen en las vistas de esperas y E/S. Los retrasos se pueden identificar a través del estado de los trabajadores y las esperas de archivos. Analizo los trabajadores del aplicador, el hilo SQL y los eventos de E/S de archivos:
- Applier-Worker con alta latencia:
SELECT worker_id, THREAD_ID, APPLYING_TRANSACTION, APPLYING_STATE FROM performance_schema.replication_applier_status_by_worker; - Puntos críticos de E/S de archivos durante las copias de seguridad:
SELECT event_name, (sum_timer_read + sum_timer_write) / 1e12 AS sec_total FROM performance_schema.file_summary_by_event_name ORDER BY sec_total DESC LIMIT 10;
Si detecto cuellos de botella, desacoplo las fases de E/S (por ejemplo, la división en ventanas, el programador de E/S o la limitación de las copias de seguridad) o aumento el número de trabajadores de aplicación en paralelo, siempre que la carga de trabajo sea escalable.
Intervalos de tiempo, instantáneas y estrategias de restablecimiento
Las mediciones requieren intervalos de tiempo bien definidos. Para el „antes/después“, utilizo reinicios y capturas de pantalla específicos:
- Restablecer los resúmenes para obtener intervalos actualizados:
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest; - Hacer una copia de seguridad externa de la instantánea:
CREATE TABLE IF NOT EXISTS perf_snapshot_digest AS SELECT NOW() AS captured_at, * FROM performance_schema.events_statements_summary_by_digest; - Mantener ventanas de historial cortas (consumidores) y recopilar tendencias a largo plazo de forma externa.
De este modo, puedo comparar y documentar de forma fiable las optimizaciones, independientemente de las implementaciones, los cambios de parámetros o las modificaciones del esquema.
Controlar los gastos generales y las necesidades de almacenamiento
Un prejuicio muy extendido es que el Performance Schema es „demasiado caro“. En la práctica, mantengo la sobrecarga al mínimo gracias a tres medidas: activar solo los instrumentos relevantes, mantener breves los consumidores de historial muy frecuentados y seleccionar adecuadamente los parámetros de almacenamiento. Cuando la varianza de los resúmenes es elevada, aumento de forma selectiva tamaño_de_los_resúmenes_de_performance_schema así como —si fuera necesario— performance_schema_max_sql_text_length, para que las identidades se mantengan estables. Si se necesitan instrumentos de memoria, los limito a los subsistemas problemáticos.
Parámetros de ajuste habituales en my.cnf:
[mysqld]
performance_schema=ON
performance-schema-instrument='statement/%=ON'
performance-schema-instrument='wait/io/%=ON'
performance-schema-instrument='wait/lock/%=ON'
performance-schema-consumer-events-statements-history=ON
performance-schema-consumer-events-waits-history=ON
# Opcional, si hay muchos patrones:
performance_schema_digests_size=10000
performance_schema_max_sql_text_length=4096 Cada vez que realizo un cambio, compruebo si la CPU, la latencia y el uso de memoria se mantienen estables. En cuanto finaliza el diagnóstico, vuelvo a ajustar la configuración al „mínimo operativo“.
Situaciones habituales y soluciones rápidas
- Una elevada suma en
resumen_de_declaraciones_sobre_eventos_por_resumen, muchas imágenes escaneadas: Comprueba los índices, el orden de los filtros y la «sargability»; confirma con EXPLICAR y repito la medición (el tiempo de digestión debe reducirse de forma apreciable). - Dominante
table_io_waitsen unas pocas tablas: Mejorar la localización de E/S (accesos a índices agrupados, índices de cobertura), reducir el volumen de datos por instrucción y, si procede, utilizar el procesamiento por lotes en lugar del procesamiento de tablas completas. - Tiempos de espera en
wait/lock/innodb/%: Identificar los registros activos y mitigar los conflictos de escritura mediante transacciones más pequeñas, índices adecuados o el uso de colas. - Muchos
wait/lock/metadata/sql/mdl: Planificar la ventana DDL,EN LÍNEA- Dar prioridad a las operaciones compatibles con esta función; desacoplar los lectores y escritores mediante transacciones más cortas. - Aumento de las reservas en
resumen_de_memoria_global_por_nombre_de_evento: Reajustar los límites, restringir de forma selectiva las cachés de consultas, identificar los componentes problemáticos conmemory/%desglosar detalladamente. - „Latencia “espigada» con valores medios que, por lo demás, no presentan anomalías: Utilizar vistas del sistema con percentiles y, si es necesario, medir los picos de carga por separado (ventana más estrecha, historial breve, instrumentos específicos).
Correlación: de «thread» a «statement» y «wait»
Para establecer rápidamente una relación entre las causas, relaciono performance_schema.threads con las tablas «Current» e «History» de las instrucciones y las esperas. Así puedo ver qué ha hecho últimamente un hilo afectado y qué está esperando. Un resumen conciso:
- Personas afectadas
PROCESSLIST_IDrespectivamenteTHREAD_IDdeperformance_schema.threadsrecoger. - Última declaración a través de
historial_de_declaraciones_sobre_eventosdeterminar (segúnTHREAD_IDy ordenar por hora). - Esperas paralelas de
historial_de_esperas_de_eventosComprobar para ver los motivos de bloqueo o de espera de E/S.
Este patrón de „Drilldown & Join“ es el que utilizo habitualmente cuando algunas sesiones o solicitudes web se desincronizan.
Puntos de control de calidad y rendimiento continuo
Para que las optimizaciones no se pierdan, establezco «Quality Gates» ágiles: se ejecutan consultas definidas del «Performance Schema» antes y después de cada lanzamiento. Guardo instantáneas, comparo los indicadores clave (Top-Digests, Top-Waits, E/S por tabla) y documento las desviaciones. En CI/CD, añado perfiles de carga representativos y valores límite para el percentil 95. Si una métrica se sale de los límites, hay un canal de retroalimentación claro: comprobar la hipótesis, centrarse en las herramientas, implementar la corrección y volver a medir.
Evitar las fuentes de error
- Demasiados instrumentos a largo plazo: El diagnóstico es temporal; en funcionamiento normal, mantén activo solo el conjunto mínimo.
- Períodos de medición mixtos: Vacíe los resúmenes antes de realizar nuevas pruebas; de lo contrario, los datos antiguos restarán valor a los resultados.
- Unidad de tiempo incorrecta: Los temporizadores se expresan en pikosegundos; de forma coherente a lo largo de todo el texto
1e12compartir. - Avalancha de resúmenes: Los literales variables pueden romper los patrones; normalizar el SQL y
performance_schema_max_sql_text_lengthCompruébalo. - El historial es demasiado largo: Las altas frecuencias de eventos y un historial extenso generan presión; mantener la ventana del historial breve y guardar instantáneas externamente.
Lista de comprobación práctica
- Definir la pregunta, formular la hipótesis.
- Utilizar los instrumentos adecuados y fomentar la participación de los consumidores, manteniendo los gastos generales al mínimo.
- Vaciar los resúmenes, seleccionar una ventana de medición corta.
- Comprobar los «top-digests», los tiempos de espera y las operaciones de E/S; confirmar los puntos críticos.
- Adaptar de forma específica el índice, la consulta, el código y los parámetros.
- Volver a medir, guardar instantáneas y documentar la decisión.
- Reducir la configuración al mínimo operativo.
En resumen: mi método en la práctica
Activo el esquema de rendimiento de forma selectiva: empiezo con un enfoque amplio y luego lo reduzco a los elementos más útiles. Instrumentos [1][2][12]. Para obtener una visión general rápida, recurro al esquema del sistema y, si es necesario, profundizo en los datos brutos [13]. Abordo primero los puntos críticos en los resúmenes y los eventos de espera, antes de ajustar los parámetros [3][15][17]. A continuación, verifico cada cambio con nuevas mediciones, para que los avances sean visibles y reproducibles. De este modo, garantizo una fiabilidad duradera Tiempos de respuesta y así me ahorro trabajo innecesario.


