2015-07-23 10 views
6

Dies ist eher eine Frage als ein Problem, das ich lösen muss. Mein Backend ist schnell und meine Abfragen laufen großartig, so dass es nicht ist, dass wichtig ist. Okay, aber lasst uns anfangen.MySQL: Wie man mehrere "Statistiken" in einer einzigen Abfrage abfragt?

Ich habe 4 Panels Statistiken auf meinem Dashboard in Bezug auf die Anzahl der Ansichten von heute, gestern, diese Woche und diesen Monat; jede nimmt eine Abfrage in meiner Datenbank auf. Was ich gefragt habe, ist, wie würde man alle diese Abfragen zusammensetzen, um die Belastung der Datenbank/Server zu erleichtern?

ich durch Stackoverflow suchen, bevor er fragte und sah einen etwas sagen wie:

SUM(case when status = 'open' then 1 else 0 end) as [Open], 
SUM(case when status = 'closed' then 1 else 0 end) as [Closed] 

Quelle: Gathering multiple statistics about a table in a single query

Welche, was ich brauche, könnte so etwas sein könnte:

SUM(case when DATE(created_at) = '2015-07-23' then 1 else 0 end) as today, 
SUM(case when DATE(created_at) = '2015-07-22' then 1 else 0 end) as yesterday, 
SUM(case when WEEK(created_at) = '29' then 1 else 0 end) as week, 
SUM(case when MONTH(created_at) = '7' then 1 else 0 end) as month 

Ich habe mich nur gefragt, ob jemand etwas bessere Vorschläge hat, wie ich dies auf meine f angewendet habe Salbung und es funktioniert gut.

+0

Während diese Dinge mit der Last auf Ihrem Server helfen könnten, könnten sie es auch behindern, wenn die Abfragen am Ende zu kompliziert werden; Es hängt wirklich von den benötigten Daten ab und davon, wie leistungsfähig der Server ist. – Uueerdo

+0

Sie können die Werte zwischenspeichern und den Cache bei Bedarf ungültig machen. Ein anderer Ansatz könnte etwas wie Trigger verwenden und die tatsächlichen Messungen beibehalten, anstatt sie zu berechnen. Vor- und Nachteile für jeden. Wie auch immer, die sich langsam ändernden zeitlichen Dimensionen deuten darauf hin, dass etwas in einem gegebenen Intervall zwischengespeichert wird. – ficuscr

+0

Danke! Das macht großen Sinn. Ich werde beide Ansätze ausprobieren und vielleicht sehen, wie sie sich im Laufe der Zeit entwickeln, wenn ich mehr Daten bekomme. Ich werde versuchen, sie zu cachen, ich werde sowieso keine Echtzeit-Updates brauchen, also könntest du es auch versuchen :-) –

Antwort

3

Die Kommentare geben gute Hinweise. Ich gebe hier eine andere Idee, die konzeptionell in den meisten Banken verwendet wird, mit denen ich gearbeitet habe.

Wenn es Milliarden von Zeilen gibt und Sie keine exakten Momentaufnahmen für jede Anfrage benötigen (dh Sie haben eine Toleranz für etwas veraltete Daten), lohnt es sich, Stapelprozesse zu untersuchen. Diese

ist, wie es funktioniert:

  1. Sie definieren Ihre Verzögerung Toleranz: zum Beispiel: „Ich bin ok mit Daten 8 Stunden veraltet“. Dies ist die Periodizität Ihres Batch-Prozesses.
  2. Sie denormalisieren die Datenbank, um eine "redundante" Spalte/Tabelle hinzuzufügen, die laufende Summen Ihrer Wahl speichert. Zum Beispiel würden Sie eine Tabelle mit dem Namen statistics_snapshot mit 4 Spalten hinzufügen: (timestamp, month, day, week) oder etwas Ähnliches.
  3. Sie erstellen eine gespeicherte Prozedur in mysql, die diese Tabelle mit Ihren 4 Abfragen füllt, oder mit einer globalen Abfrage, wie Sie es vorgeschlagen haben. Ein Zeitstempel wird ebenfalls registriert, damit Sie wissen, wann er genommen wurde.
  4. Sie erstellen einen Benutzer mit EXECUTE Gewähr für dieses Verfahren, ONLY.

    CREATE USER 'cron_mysql_user'@'localhost' IDENTIFIED BY 'strongpassword'; 
    GRANT EXECUTE ON PROCEDURE db_name.proc_name TO 'cron_mysql_user'@'localhost'; 
    
  5. Sie verwenden DBMS_JOB einen cron-Job mysql und führen Sie diese Prozedur mit Periodizität in Punkt 1 definiert zu verbinden. Normalerweise können Sie Skripts über die Befehlszeile wie folgt ausführen:

    mysql --user='cron_mysql_user'@'localhost' -pstrongpassword --execute="call proc_name()" db_name 
    
  6. Sie erstellen schöne Berichte basierend auf dem periodischen Schnappschüsse :-)

Der Vorteil dabei ist, dass Sie die zentrale I/O nur ein paar Mal am Tag, eine kontrollierte Art und Weise, so dass Sie nur eine sehr leichte SELECT-Anweisung zu tun haben, wenn Sie die Statistiken kennen müssen.

+0

Danke dir so viel :-) Ich werde es versuchen, besonders da es ein privates Dashboard ist so real- Zeitdaten sind nicht wahnsinnig wichtig. Ich werde Sie hier wissen lassen, wenn überhaupt. –

Verwandte Themen