Comment déterminer les requêtes MySQL par jour?

15

J'étudie le gros passage de MySQL à un NoSQL DBaaS et j'ai rencontré un problème en essayant de prévoir les dépenses. Essentiellement, je ne peux pas savoir combien de requêtes mon serveur MySQL actuel traite par jour pour essayer d'estimer le nombre de requêtes que j'utiliserai avec Cloudant , qui facturent 0,015 $ pour 100 PUT, POST et DELETE et 0,015 $ pour 500 GET. et TÊTES.

J'ai trouvé beaucoup d'informations sur l'utilisation de SHOW STATUS et SHOW GLOBAL STATUS pour obtenir les statistiques que MySQL recueille sur lui-même, mais il n'y a pas de référence de délai.

Par exemple, SHOW GLOBAL STATUS renvoie ce qui suit:

Queries                           | 13576675

Ce qui est génial, sauf que je n'ai aucune idée du délai qui entoure ce nombre. 13 millions de requêtes quand? Par mois? Année? Depuis le début des temps?

Les documents MySQL n'élaborent pas vraiment trop:

Requêtes

Nombre d'instructions exécutées par le serveur. Cette variable inclut des instructions exécutées dans des programmes stockés, contrairement à la variable Questions. Il ne compte pas les commandes COM_PING ou COM_STATISTICS. Cette variable a été ajoutée dans MySQL 5.0.76.

Merci d'avance pour votre aide.

AJB
la source
2
La Queriesvariable d'état globale compte tout depuis le dernier démarrage du serveur ... il y a SHOW STATUS LIKE 'Uptime';quelques secondes. De nombreuses variables d'état sont effacées FLUSH STATUS;mais Queriesne le sont pas, du moins dans les serveurs de test sur lesquels je l'ai confirmé tout à l'heure, qui étaient MySQL 5.5.19 et 5.6.14.
Michael - sqlbot

Réponses:

15

Pour les SELECT:

show global status like "Com_select";

Mises à jour:

show global status like "Com_update";

INSERT:

show global status like "Com_insert";

SUPPRIMER:

show global status like "Com_delete";

Les valeurs ALl sont "cumulatives" depuis le dernier redémarrage de MySQL.

Donc, pour obtenir vos SELECT en une heure:

À 21 heures:

[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)

À 10 heures du soir:

[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)

Le nombre de SELECT au cours de la dernière heure: 672363 - 671664 = 699

Meilleures salutations

Maxime Fouilleul
la source
Merci @mfouilleul, c'est utile. Je vais combiner cela avec la durée var et déterminer le volume de requêtes.
AJB
1
Juste pour clarifier, les show global status like 'Com_%';commandes sont pour tout le serveur, non? Quelle serait une alternative dans un environnement partagé - par exemple: pour estimer à quelle distance nous sommes max_questions/ max de requêtes par heure (QPH).
Fabien Snauwaert
9

J'utilise cette vue pour garder un œil sur le nombre de requêtes par seconde, minute, heure et jour:

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');

Exemple de sortie:

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
la source