Para melhor Desempenho do MySQL Utilizo o Performance Schema para analisar dados de tempo de execução relativos a consultas, esperas, bloqueios, memória e E/S diretamente através de SQL. Desta forma, consigo identificar mais rapidamente as causas por trás das instruções lentas e tomar medidas específicas para Afinação e monitorização a partir de [2][3][15].
Pontos centrais
Os pontos-chave que se seguem ajudam-me a utilizar o Performance Schema de forma eficaz.
- Ativação e uma configuração simplificada com instrumentos e consumidores adequados
- Resumos de declarações utilizar para identificar padrões dispendiosos e pontos críticos
- Eventos de espera, analisar em conjunto os bloqueios e as entradas/saídas para identificar os verdadeiros pontos de estrangulamento
- Esquema do Sys como abreviatura de perspetivas rápidas e úteis para a tomada de decisões
- Iterativo Fluxo de trabalho: medir, isolar, alterar, medir novamente
Ativar o Performance Schema e configurá-lo de forma adequada
Primeiro verifico se performance_schema está ativado, uma vez que as versões atuais do MySQL normalmente vêm com esta opção ativada [1][12]. Se não estiver presente, defino no [mysqld]-Bloco do my.cnf a variável performance_schema=ON e reinicio o servidor. Depois, configuro os instrumentos e os consumidores de forma específica, em vez de deixar tudo no máximo permanentemente. Concentro-me em declaração/%, wait/% e os percursos de E/S relevantes, para que eu possa recolher dados significativos sem sobrecarga desnecessária [6]. Para uma nova série de medições, esvazio as tabelas de histórico em questão e começo com uma Base.
Resultados rápidos com o Sys-Schema
Para ter uma visão geral rápida, recorro frequentemente ao sys-Schema, porque agrupa de forma útil os dados brutos do Performance Schema [13]. Assim, consigo identificar em poucos minutos as consultas que representam a maior parte do tempo de execução. Começo pelas instruções mais importantes, verifico as vistas de E/S de ficheiros e analiso os resumos de espera dos threads. Assim que identifico um ponto crítico, volto às tabelas de dados brutos e aprofundo a análise. Quem analisar os planos de consulta pode, com as medidas adequadas, Dicas do Optimizer frequentemente percetíveis já num curto espaço de tempo Ganhos alcançar.
Escolher os instrumentos e os consumidores adequados
Começo de forma abrangente, mas mantenho a observação sob controlo: em primeiro lugar, ativo os mais importantes Instrumentos para instruções, tempos de espera e E/S; depois, desativo tudo o que não forneça informações úteis [6]. Elementos como o histórico de eventos e as tabelas de resumo têm de apoiar as questões a que pretendo responder. Se se tratar, por exemplo, de picos de latência, consulto resumo_de_esperas_de_eventos_globais_por_nome_de_evento e compara isso com resumo_das_declarações_sobre_eventos_por_resumo. Se ocorrerem tempos de espera de E/S, verifico resumo_do_ficheiro_por_nome_do_evento e resumo_das_esperas_de_E/S_por_tabela. Esta seleção específica mantém os custos gerais baixos e, mesmo assim, proporciona resultados fiáveis Dados.
Resumos de instruções: Detetar padrões, reduzir a carga
Com os resumos de instruções, consigo ver quais os padrões que são consistentemente dispendiosos, mesmo que as consultas individuais contenham literais variáveis [17]. Ordeno os resultados por tempo total, número de execuções e latência média, para definir prioridades. Para tal, recorro também ao Analisar o registo de consultas lentas volto atrás para não deixar escapar valores atípicos raros. Quando os resumos revelam picos, verifico os índices, as estratégias de JOIN e a ordem dos filtros com EXPLICAR. Em seguida, confirmo o efeito através de novas medições no Performance Schema, para que as otimizações continuem a ser mensuráveis.
Interpretar eventos de espera, bloqueios e E/S
Quando há consultas em espera, consulto as tabelas «Wait» e «Lock» para identificar a verdadeira Causa pode ser encontrado [3]. Se houver muitos threads a executarem-se nas mesmas tabelas, isso indica table_lock-Aguardo a ocorrência de concorrência. Se os eventos de E/S de ficheiros apresentarem latências elevadas, verifico o armazenamento e o cache, bem como os padrões de consulta com varreduras de grande escala. Se detetar bloqueios de linha do InnoDB, analiso os registos mais acedidos, a duração das transações e a cobertura dos índices. Só quando estas peças do puzzle se encaixarem é que intervenho nos parâmetros do servidor, no esquema ou no código.
Monitorização da memória: Memória e pool de buffer
Para resolver problemas de memória, analiso em conjunto as tabelas de memória e a utilização do buffer do InnoDB. Se a necessidade de memória de componentes específicos aumentar, ajusto os limites e verifico se os caches estão a reter dados incorretos. Se o cache do InnoDB não for suficiente, aumentei a sua proporção ou melhorei a localização das consultas. Quem quiser aprofundar o assunto pode consultar Otimizar o buffer pool obter ganhos significativos em termos de latência. Confirmo o efeito com os Resumo- Analisar as tabelas e verificar se os acertos LRU e os tempos de espera de E/S estão a evoluir na direção certa.
Fluxo de trabalho de diagnóstico iterativo para o dia-a-dia
Trabalho sempre em ciclos bem definidos, para não perder tempo e para que as alterações continuem a ser mensuráveis [3]. Primeiro, reproduzo o problema sob uma carga controlada. Depois, recolho os valores medidos em algumas tabelas específicas e isolo os candidatos mais evidentes. Em seguida, alterei aquilo que promete maior benefício: índice, consulta, parâmetro ou código. Por fim, voltei a medir e documentei brevemente Antes/depois-Tabelas, para que a equipa veja imediatamente o impacto.
Exemplos de consultas: dos dados brutos às decisões
Para as questões mais comuns, anotei alguns trechos concisos de SQL que utilizo diretamente no meu dia-a-dia. A tabela apresenta exemplos que utilizo frequentemente e o que cada um deles significa. Ajusto filtros como LIMITE ou ORDER BY consoante o caso em questão. O importante é: primeiro a hipótese, depois uma avaliação específica e uma decisão clara. É assim que mantenho a análise focada e evito o supérfluo Carga.
| Tabela(s) do esquema de desempenho | Objetivo | Colunas importantes | Exemplo de consulta |
|---|---|---|---|
resumo_das_declarações_sobre_eventos_por_resumo | Encontrar amostras caras | digest_text, 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; |
resumo_de_esperas_de_eventos_globais_por_nome_de_evento | Pontos críticos de espera | nome_do_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; |
resumo_das_esperas_de_E/S_por_tabela | Verificar a E/S das tabelas | esquema_do_objeto, nome_do_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; |
resumo_da_memória_global_por_nome_do_evento | Identificar aplicações que consomem muita memória | nome_do_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; |
Operações de produção: minimizar os custos gerais, maximizar o impacto
Em sessões ao vivo, não ativo instrumentos às cegas, mas seleciono apenas aquilo que responde à minha pergunta [6]. Trato os eventos de alta frequência com cuidado e mantenho as janelas de histórico curtas. Para observações mais longas, prefiro resumos condensados e guardo instantâneos externamente. Presto atenção à entrada em performance_schema_setup_consumers, para que eu possa controlar as coleções em vez de as deixar a funcionar por si só. Este enfoque mantém a análise eficaz e protege o servidor.
Ajuste fino: instrumentos e consumidores de configuração na prática
Para obter rapidamente resultados fiáveis, configuro os instrumentos e os consumidores de forma específica. São particularmente importantes declaração/%, wait/%, wait/io/% e – se necessário – selecionados memory/%-caminhos. Começo por ativar apenas o estritamente necessário e, depois, vou ampliando à medida que surgem questões concretas que ainda não foram respondidas. Os temporizadores no esquema de desempenho medem em picossegundos; para obter valores em segundos, divido as colunas de latência por 1e12.
Ponto de partida típico durante a execução:
-- Ativar instrumentos-chave
UPDATE performance_schema.setup_instruments
SET ENABLED='YES', TIMED='YES'
WHERE NAME LIKE 'statement/%'
OR NAME LIKE 'wait/io/%'
OR NAME LIKE 'wait/lock/%';
-- Selecionar 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');
-- Esvaziar os resumos para uma nova série de medições
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; Quando preciso de análises de memória, ativo-as seletivamente memory/%-Instrumentos. Isso implica mais custos gerais, mas compensa em caso de fugas de memória ou de forte pressão sobre o alocador.
Dimensões: Compreender o utilizador, o host e o esquema
Os picos de potência nem sempre são globais, mas sim limitados a determinados Utilizador, Anfitriões ou um Esquema limitado. Para tal, o Performance Schema fornece resumos por conta e por host. Além disso, incluí no resumo a coluna nome_do_esquema, para delimitar os pontos críticos por base de dados.
Exemplos que utilizo frequentemente:
- Esquemas principais por duração 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; - Utilizadores/anfitriões que causam maior latência (por contas):
SELECT user, host, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_account_by_event_name GROUP BY user, host ORDER BY sec_total DESC LIMIT 10; - Threads com maior tempo 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;
Com estas visualizações, separo segmentos de tráfego de forma específica e posso limitar o tráfego, armazenar em cache ou implementar variantes de consultas por cliente.
Tornar visíveis as transações longas e os bloqueios de metadados
As transações de longa duração ou inativas bloqueiam os pontos de verificação, a purga e as operações DML concorrentes. Por isso, verifico regularmente a vista das transações e as esperas MDL:
- Transações ativas:
SELECT thread_id, timer_wait/1e12 AS sec_running, state FROM performance_schema.events_transactions_current ORDER BY sec_running DESC LIMIT 10; - Detetar bloqueios de metadados (concorrência 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;
Se o MDL for predominante, replaneio as janelas DDL, minimizo os tempos de retenção de bloqueios no código (transações mais curtas) e verifico se há AUTOCOMMIT=0- Manter as sessões abertas por um período desnecessariamente longo.
Replicação, cópias de segurança e efeitos colaterais em destaque
Os processos de replicação e cópia de segurança aparecem nas vistas «Waits» e «I/O». É possível identificar os atrasos através do estado dos workers e das esperas de ficheiros. Analiso os eventos dos workers do Applier, do thread SQL e de E/S de ficheiros:
- Applier-Worker com elevada latência:
SELECT worker_id, THREAD_ID, APPLYING_TRANSACTION, APPLYING_STATE FROM performance_schema.replication_applier_status_by_worker; - Pontos críticos de E/S de ficheiros durante as cópias de segurança:
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;
Se detetar pontos de estrangulamento aqui, separo as fases de E/S (por exemplo, windowing, agendador de E/S, limitação de cópias de segurança) ou aumente o número de trabalhadores do aplicador em paralelo, desde que a carga de trabalho seja escalável.
Intervalos de tempo, instantâneos e estratégias de reinicialização
As medições requerem intervalos de tempo bem definidos. Para comparar o „antes“ e o «depois», recorro a reinicializações e instantâneos específicos:
- Reiniciar os resumos para obter intervalos atualizados:
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest; - Fazer uma cópia de segurança externa do instantâneo:
CREATE TABLE IF NOT EXISTS perf_snapshot_digest AS SELECT NOW() AS captured_at, * FROM performance_schema.events_statements_summary_by_digest; - Manter janelas de histórico curtas (consumidor), recolher tendências de longo prazo externamente.
Desta forma, posso comparar e documentar com segurança as otimizações ao longo de implementações, alterações de parâmetros ou alterações de esquema.
Gerir a sobrecarga e os requisitos de memória
Um preconceito comum é que o Performance Schema é „demasiado caro“. Na prática, mantenho a sobrecarga baixa através de três medidas: ativar apenas os instrumentos relevantes, manter curtos os consumidores de histórico com elevado tráfego e selecionar os parâmetros de memória adequados. Em caso de elevada variância do digest, aumentei de forma seletiva performance_schema_digests_size bem como – se necessário – performance_schema_max_sql_text_length, para que as identidades se mantenham estáveis. Caso sejam necessários instrumentos de memória, limito-os aos subsistemas problemáticos.
Ajustes típicos em 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, se houver muitos padrões:
performance_schema_digests_size=10000
performance_schema_max_sql_text_length=4096 Sempre que faço uma alteração, verifico se a CPU, a latência e a utilização da memória se mantêm estáveis. Assim que o diagnóstico estiver concluído, volto a definir a configuração para o „mínimo operacional“.
Padrões frequentes e soluções rápidas
- Montante elevado em
resumo_das_declarações_sobre_eventos_por_resumo, muitas digitalizações: Verifica os índices, a ordem dos filtros e a capacidade de armazenamento; confirma com EXPLICAR e repito a medição (o tempo de digestão deve diminuir visivelmente). - Dominante
table_io_waitsem poucas tabelas: Melhorar a localização de E/S (acessos a índices agrupados, índices abrangentes), reduzir o volume de dados por instrução e, se necessário, utilizar o processamento em lotes em vez do processamento de tabelas completas. - Tempos de espera para
wait/lock/innodb/%: Identificar «hot records» e mitigar conflitos de gravação através de transações mais pequenas, índices adequados ou enfileiramento. - Muitos
wait/lock/metadata/sql/mdl: Planear a janela DDL,ONLINE- dar preferência a operações compatíveis, desacoplar o leitor/gravador através de transações mais curtas. - Aumento das reservas em
resumo_da_memória_global_por_nome_do_evento: Reajustar limites, restringir de forma seletiva as caches de consultas, identificar componentes problemáticos commemory/%desagregar em pormenor. - „Latência “spiky» com valores médios, de resto, normais: Utilizar as visualizações do Sys com percentis e, se necessário, medir separadamente os picos de carga (janela mais restrita, histórico curto, instrumentos específicos).
Correlacionar: Do thread à instrução e à espera
Para estabelecer rapidamente uma correlação entre as causas, associo performance_schema.threads com as tabelas «Current» e «History» para instruções e esperas. Assim, consigo ver o que um thread em questão fez por último e o que está a aguardar. Um resumo conciso:
- Pessoas afetadas
PROCESSLIST_IDrespectivamenteTHREAD_IDdeperformance_schema.threadsir buscar. - Última declaração através de
histórico_de_declarações_sobre_eventosdeterminar (de acordo comTHREAD_IDe ordenar por hora). - Exclusões de espera paralelas
histórico_de_esperas_de_eventosverificar para ver os motivos de bloqueio ou de espera de E/S.
Este padrão „Drilldown & Join“ é o que utilizo habitualmente quando sessões individuais ou pedidos Web ficam desincronizados.
Portas de Qualidade e Desempenho Contínuo
Para garantir que as otimizações não sejam em vão, estabeleço «Quality Gates» simplificados: consultas definidas do Performance Schema são executadas antes e depois de cada lançamento. Guardo instantâneos, comparo indicadores (Top-Digests, Top-Waits, E/S por tabela) e documento os desvios. No CI/CD, adiciono perfis de carga representativos e valores-limite para o 95.º percentil. Se uma métrica sair dos limites, existe um canal de retorno claro: verificar a hipótese, focar as ferramentas, implementar a correção e medir novamente.
Evitar fontes de erro
- Demasiados instrumentos a longo prazo: O diagnóstico é temporário; em funcionamento normal, mantenha ativo apenas o conjunto mínimo.
- Períodos de medição mistos: Esvazie os resumos antes de realizar novos testes; caso contrário, os dados antigos comprometem a validade dos resultados.
- Unidade de tempo incorreta: Os temporizadores estão em picossegundos; de forma coerente ao longo de todo o texto
1e12partilhar. - Enchente de resumos: Os literais variáveis podem quebrar os padrões; normalizar o SQL e
performance_schema_max_sql_text_lengthverificar. - Histórico demasiado longo: A elevada frequência de eventos + um histórico extenso geram pressão; manter a janela do histórico curta, instantâneos externos.
Lista de verificação prática
- Definir a questão, formular a hipótese.
- Ativar os instrumentos adequados/consumidores, manter os custos gerais baixos.
- Esvaziar os resumos, selecionar uma janela de medição curta.
- Verificar os Top-Digests, tempos de espera e E/S; confirmar os pontos críticos.
- Ajustar de forma específica o índice, a consulta, o código e os parâmetros.
- Medir novamente, guardar instantâneos, documentar a decisão.
- Reduzir a configuração ao mínimo operacional.
Em resumo: a minha abordagem na prática
Ativo o Performance Schema de forma direcionada, começo por uma abordagem abrangente e, em seguida, reduzo ao que for mais útil Instrumentos [1][2][12]. Para uma visão geral rápida, recorro ao esquema do sistema e, se necessário, analiso os dados brutos [13]. Abordo primeiro os pontos críticos nos «digests» e nos «wait-events», antes de ajustar os parâmetros [3][15][17]. Em seguida, confirmo cada alteração com novas medições, para que os progressos se mantenham visíveis e reproduzíveis. É assim que garanto resultados fiáveis a longo prazo Tempos de resposta e evito trabalho desnecessário.


