Identificar problemas e Melhorar a Performance no MySQL
Caso o seu ambiente apresente algum tipo de lentidão ou travamento, é interessante verificar se existe algum bloqueio no banco de dados com longa duração. Uma forma de você tentar verificar isso seria executando o comando abaixo:
sql
SELECT
waiting_pid, -- id da query bloqueada
waiting_query, -- comando da query bloqueada
blocking_pid, -- id da query bloqueadora
blocking_query -- comando da query bloqueadora
FROM sys.innodb_lock_waits;
Caso ainda não traga as informações desejadas, você pode consultar os processos em execução com mais detalhes através da consulta abaixo:
sql
SHOW PROCESSLIST;
Ou:
sql
SELECT
pl.id,
pl.user,
pl.host,
pl.db,
pl.command,
pl.time,
pl.state,
SUBSTRING(pl.info, 1, 60) AS info,
it.trx_rows_modified
FROM information_schema.processlist pl
LEFT JOIN information_schema.innodb_trx it
ON pl.id = it.trx_mysql_thread_id;
pl.id
: ID da sessão.pl.user
: usuário que iniciou a conexão.pl.host
: host a partir do qual a execução está ocorrendo.pl.db
: nome do banco de dados em uso pela conexão.pl.command
: tipo de comando sendo executado (e.g., Query, Sleep).pl.time
: tempo de execução do comando atual, em segundos.pl.state
: estado atual da conexão.SUBSTRING(pl.info, 1, 60) AS info
: primeiros 60 caracteres da coluna info, que contém a informação sobre o comando em execução.it.trx_rows_modified
: número de linhas modificadas ou inseridas pela transação.
Uma vez identificada uma sessão mais demorada e com impacto nas demais sessões, é possível checar se o plano de execução está adequado. Nesse retorno, é possível verificar se a consulta está fazendo uso de índice e se esse filtro apresenta boa cobertura.
sql
EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';