Obtém o tempo médio de execução de todas as consultas selecionadas

4

tl; dr : Como posso obter o tempo médio de execução de consultas de instruções selecionadas de um servidor MySQL em execução?

Neste momento, temos vários servidores de banco de dados, com alguns escravos tratados como servidores somente leitura. Para aumentar o desempenho esperançosamente, configuramos um teste com uma tabela particionada (que contém novos dados acessados com frequência e uma quantidade extrema de dados históricos que os poderes decididos devem permanecer nessa tabela).

Agora, particionamos com base em uma coluna datetime e, em alguns testes manuais, algumas consultas são mais rápidas, outras mais lentas (obviamente, como uma boa parte limita explicitamente o resultado nessa coluna e algumas consultas explicitamente não funcionam) t quer isso).

Tudo bem, tudo parece funcionar, com uma contagem de consulta lenta um pouco maior que a média no servidor particionado e, em seguida, no servidor não particionado. Isso era de se esperar, mas normalmente, essas consultas também têm prioridade menor do que aquelas que fazem desejam os dados mais recentes. No entanto, é bastante difícil comparar objetivamente o desempenho entre os dois escravos. A maioria das consultas que são aceleradas não estavam no log lento para começar, a carga média nos servidores é praticamente a mesma etc.

O ideal é que eu queira o tempo médio de execução de todas as consultas selecionadas nos dois escravos, para que eu possa comparar se há uma aceleração geral ou degradação após a criação de uma lista. Em mysqlreport ou mysqladmin ext nada sai como um valor que eu poderia usar para isso, e nem mesmo o log de consulta geral parece conter isso. Eu pensei em definir o long_query_time para 0 por um tempo, mas isso realmente atrasaria os servidores, então estou aberto a outras opções, se houver algum?

    
por Wrikken 21.07.2011 / 19:20

1 resposta

3

Você precisa procurar em mk-query-digest

Esta ferramenta pode, na verdade, ser executada contra o mysql por um período de tempo específico que você designar e produzirá um mapa das 20 principais consultas por padrão de consulta e dará a você um tempo médio de execução.

Aqui está um excelente vídeo do YouTube sobre como usá-lo como um log lento ad hoc

ATUALIZAÇÃO 2011-07-21 15:58 EDT

Eu tenho uma surpresa agradável para você !!! Se você estiver usando o MySQL 5.1, você pode converter o log geral e log lento em tabelas. Eu estou usando agora com um grande cliente. Aqui está como você pode fazer isso:

No esquema mysql, existem as tabelas general_log abd slow_log.

mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE 'general_log' (
  'event_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  'user_host' mediumtext NOT NULL,
  'thread_id' int(11) NOT NULL,
  'server_id' int(10) unsigned NOT NULL,
  'command_type' varchar(64) NOT NULL,
  'argument' mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.05 sec)

mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: CREATE TABLE 'slow_log' (
  'start_time' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  'user_host' mediumtext NOT NULL,
  'query_time' time NOT NULL,
  'lock_time' time NOT NULL,
  'rows_sent' int(11) NOT NULL,
  'rows_examined' int(11) NOT NULL,
  'db' varchar(512) NOT NULL,
  'last_insert_id' int(11) NOT NULL,
  'insert_id' int(11) NOT NULL,
  'server_id' int(10) unsigned NOT NULL,
  'sql_text' mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.11 sec)

Você pode ativar o uso deles configurando isso em /etc/my.cnf

[mysqld]
log-output=TABLE

Claro, quem quer um arquivo CSV para um log geral e log lento ??? SURPRESA: CONVERTE-OS A MYISAM E ADICIONE UM ÍNDICE AO MOMENTO DE CADA ENTRADA !!!

SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G

SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL slow_query_log = @old_log_state;

Por favor, note que o log geral tem a coluna event_time e o log lento tem a hora de início da coluna. Apenas o log lento tem a coluna query_time.

    
por 21.07.2011 / 21:32