Wie bestimme ich MySQL-Abfragen pro Tag?

15

Ich untersuche den großen Umstieg von MySQL auf eine NoSQL-DBaaS und bin auf ein Problem gestoßen, bei dem versucht wurde, die Kosten zu prognostizieren. Im Wesentlichen kann ich nicht herausfinden, wie viele Abfragen mein aktueller MySQL-Server pro Tag bearbeitet, um die Anzahl der Anforderungen zu schätzen , die ich mit Cloudant verwende . Dabei werden 0,015 US-Dollar pro 100 PUTs, POSTs und DELETEs sowie 0,015 US-Dollar pro 500 GETs berechnet und KÖPFE.

Ich habe viele Informationen über die Verwendung von SHOW STATUS und SHOW GLOBAL STATUS gefunden , um die Statistiken abzurufen , die MySQL für sich selbst sammelt, aber es gibt keinen Zeitrahmenbezug.

Beispielsweise gibt SHOW GLOBAL STATUS Folgendes zurück:

Queries                           | 13576675

Das ist großartig, außer ich habe keine Ahnung, in welchem ​​Zeitrahmen sich diese Zahl befindet. 13 Millionen Anfragen wann? Pro Monat? Jahr? Seit Anbeginn der Zeit?

Die MySQL-Dokumente sind nicht besonders umfangreich:

Abfragen

Die Anzahl der vom Server ausgeführten Anweisungen. Diese Variable enthält Anweisungen, die im Gegensatz zur Variablen "Questions" in gespeicherten Programmen ausgeführt werden. Es werden keine COM_PING- oder COM_STATISTICS-Befehle gezählt. Diese Variable wurde in MySQL 5.0.76 hinzugefügt.

Vielen Dank im Voraus für jede Hilfe.

AJB
quelle
2
Die Queriesglobale Statusvariable zählt alles, seit der Server das letzte Mal gestartet wurde ... das war vor SHOW STATUS LIKE 'Uptime';Sekunden. Viele Statusvariablen werden mit gelöscht, FLUSH STATUS;aber Queriesnicht, zumindest in den Testservern, auf denen ich es gerade bestätigt habe, nämlich MySQL 5.5.19 und 5.6.14.
Michael - sqlbot

Antworten:

15

Für SELECTs:

show global status like "Com_select";

Aktualisierung:

show global status like "Com_update";

INSERTs:

show global status like "Com_insert";

LÖSCHEN:

show global status like "Com_delete";

ALle Werte sind seit dem letzten Neustart von MySQL "kumulativ".

So erhalten Sie Ihre SELECTs in einer Stunde:

Um 9 Uhr abends:

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

Um 10 Uhr:

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

Die Anzahl von SELECT in der letzten Stunde: 672363 - 671664 = 699

Freundliche Grüße

Maxime Fouilleul
quelle
Danke @mfouilleul, das ist hilfreich. Ich werde dies mit der Dauer var kombinieren und das Volumen der Abfragen herausfinden.
AJB
1
Nur zur Verdeutlichung: show global status like 'Com_%';Befehle gelten für den gesamten Server, oder? Was wäre eine Alternative in einer gemeinsam genutzten Umgebung - z. B. um zu schätzen, wie weit wir von max_questions/ max Anfragen pro Stunde (QPH) entfernt sind.
Fabien Snauwaert
9

Ich benutze diese Ansicht, um die Anzahl der Abfragen pro Sekunde, Minute, Stunde und Tag im Auge zu behalten:

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

Beispielausgabe:

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
quelle