Como determinar consultas MySQL por dia?

15

Estou investigando a grande mudança do MySQL para o NoSQL DBaaS e encontrei um problema ao tentar prever despesas. Essencialmente, não consigo descobrir quantas consultas meu servidor MySQL atual processa por dia para tentar estimar o número de solicitações que usarei com o Cloudant , que cobra US $ 0,015 por 100 PUTs, POSTs e DELETEs e US $ 0,015 por 500 GETs e CABEÇAS.

Eu encontrei muitas informações sobre o uso de SHOW STATUS e SHOW GLOBAL STATUS para obter as estatísticas que o MySQL coleta em si, mas não há referência de período de tempo.

Por exemplo, SHOW GLOBAL STATUS retorna o seguinte:

Queries                           | 13576675

O que é ótimo, exceto que eu não tenho ideia do prazo que envolve esse número. 13 milhões de consultas quando? Por mês? Ano? Desde o começo dos tempos?

Os documentos do MySQL não elaboram muito:

Consultas

O número de instruções executadas pelo servidor. Essa variável inclui instruções executadas nos programas armazenados, diferentemente da variável Questions. Não conta os comandos COM_PING ou COM_STATISTICS. Esta variável foi adicionada no MySQL 5.0.76.

Agradecemos antecipadamente por qualquer ajuda.

AJB
fonte
2
A Queriesvariável de status global está contando tudo desde que o servidor foi iniciado pela última vez ... SHOW STATUS LIKE 'Uptime';há alguns segundos. Muitas variáveis ​​de status são limpas, FLUSH STATUS;mas Queriesnão são, pelo menos nos servidores de teste que eu confirmei agora, que eram o MySQL 5.5.19 e 5.6.14.
Michael - sqlbot

Respostas:

15

Para SELECTs:

show global status like "Com_select";

ATUALIZAÇÕES:

show global status like "Com_update";

INSERTs:

show global status like "Com_insert";

DELETE:

show global status like "Com_delete";

Todos os valores são "cumulativos" desde a última reinicialização do MySQL.

Então, para obter seus SELECTs em uma hora:

Às 21:00:

[21:00:00] [DEV\(none)] mysql> show global status like "Com_select";
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Com_select    | 671664 |
+---------------+--------+
1 row in set (0.00 sec)

Às 22h:

[22:00:00] [DEV\(none)] mysql> show global status like "Com_select";
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Com_select    | 672363 |
+---------------+--------+
1 row in set (0.00 sec)

O número de SELECT na última hora: 672363 - 671664 = 699

Cumprimentos

Maxime Fouilleul
fonte
Obrigado @mfouilleul, isso é útil. Vou combinar isso com a duração var e descobrir o volume de consultas.
AJB
1
Só para esclarecer, os show global status like 'Com_%';comandos são para todo o servidor, certo? O que seria uma alternativa em um ambiente compartilhado - por exemplo: estimar a que distância estamos de max_questions/ max Queries Per Hour (QPH) sendo atingido.
Fabien Snauwaert 28/09
9

Eu uso essa visão para ficar de olho no número de consultas por segundo, minuto, hora e dia:

create or replace view _dba_query_stats as
select 
  SUBSTRING(VARIABLE_NAME, 5) as query_type, 
  VARIABLE_VALUE as total_count, 
  round(VARIABLE_VALUE / ( select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Uptime_since_flush_status'), 2) as per_second,
  round(VARIABLE_VALUE / ((select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Uptime_since_flush_status') / (60)))       as per_minute,
  round(VARIABLE_VALUE / ((select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Uptime_since_flush_status') / (60*60)))    as per_hour, 
  round(VARIABLE_VALUE / ((select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Uptime_since_flush_status') / (60*60*24))) as per_day,
  FROM_UNIXTIME(round(UNIX_TIMESTAMP(sysdate()) - (select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Uptime_since_flush_status'))) report_period_start,
  sysdate() as report_period_end,
  TIME_FORMAT(SEC_TO_TIME((select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME = 'Uptime_since_flush_status')),'%Hh %im') as report_period_duration
from 
  information_schema.GLOBAL_STATUS 
where 
  VARIABLE_NAME in ('Com_select', 'Com_delete', 'Com_update', 'Com_insert');

Saída de amostra:

query_type total_count per_second per_minute per_hour per_day report_period_start report_period_end   report_period_duration
DELETE               0          0          0       0        0 2017-04-16 03:46    2017-04-20 22:14:56 114h 28m
INSERT           36595       0.09          5     320     7672 2017-04-16 03:46    2017-04-20 22:14:56 114h 28m
SELECT        14842019      36.02       2161  129656  3111738 2017-04-16 03:46    2017-04-20 22:14:56 114h 28m
UPDATE          189137       0.46         28    1652    39654 2017-04-16 03:46    2017-04-20 22:14:56 114h 28m
Matty
fonte