Aggregiert Datentabellen

8

Ich baue eine Front-End zu einem größeren db (10 Millionen von Reihen). Die Daten sind Wasserverbrauch für viele verschiedene Unternehmen und die Tabelle sieht etwa so aus:

%Vor%

Am Frontend kann der Benutzer auswählen, wie er die Daten sehen möchte, zB: 6 Stundenschritte, Tagesschritte, Monatlich usw. Was wäre der beste Weg, dies schnell zu tun. Angesichts der Datenänderungen und der Häufigkeit, mit der ein Datensatz angezeigt wird, ist das Zwischenspeichern der Abfragedaten in Memcahce oder ähnlichem nahezu sinnlos, und es gibt keine Möglichkeit, die Daten vorab zu erstellen, da zu viele Variablen vorhanden sind.

Ich dachte mir, dass die Verwendung einer aggregierten aggregierten Tabelle funktionieren würde mit Tabellen wie readings , readings_6h , readings_1d mit genau der gleichen Struktur, nur bereits aggregiert.

Wenn dies eine praktikable Lösung ist, was ist der beste Weg, um die aggregierten Tabellen aktuell und genau zu halten? Neben den Daten, die von Zählern kommen, ist die Tabelle nur lesbar. Benutzer müssen nicht immer aktualisieren oder schreiben.

Eine Anzahl möglicher Lösungen beinhaltet:

1) Halten Sie sich an Anfragen mit Gruppen- / Aggregatfunktionen im laufenden Betrieb

2) eine grundlegende Auswahl und speichern

%Vor%

3) doppelte Schlüsselaktualisierung (nicht sicher, wie die Aggregation hier ausgeführt werden würde, auch um sicherzustellen, dass die Daten nicht doppelt gezählt werden oder Zeilen fehlen.

%Vor%

4) andere Ideen / Empfehlungen?

Ich mache derzeit Option 2, die ungefähr 15 Minuten benötigt, um + - 100k Zeilen in + - 30k Zeilen über 4 Tabellen zu sammeln (_6h, _1d, _7d, _1m, _1y)

TL; DR Was ist der beste Weg, um aggregierte Daten für zahlreiche Berichte anzuzeigen / zu speichern, die nicht effektiv zwischengespeichert werden können.

    
dogmatic69 26.07.2012, 17:35
quelle

1 Antwort

8

Diese Funktion wird am besten von einer Funktion namens materialisierte Ansicht unterstützt, die MySQL leider nicht enthält. Sie könnten in ein anderes Datenbanksystem wie PostgreSQL migrieren.

Es gibt Möglichkeiten, materialisierte Ansichten in MySQL mit gespeicherten Prozeduren, Triggern und Ereignissen zu emulieren. Sie erstellen eine gespeicherte Prozedur, die die zusammengefassten Daten aktualisiert. Wenn die aggregierten Daten bei jedem Einfügen aktualisiert werden müssen, können Sie einen Trigger definieren, um die Prozedur aufzurufen. Wenn die Daten alle paar Stunden aktualisiert werden müssen, können Sie ein MySQL-Scheduler-Ereignis definieren ein Cron-Job, um es zu tun.

Es gibt einen kombinierten Ansatz, ähnlich wie bei Option 3, der nicht von den Daten der Eingabedaten abhängt; Stellen Sie sich vor, was passiert, wenn einige neue Daten einen Moment zu spät eintreffen und nicht in die Aggregation gelangen. (Sie haben dieses Problem möglicherweise nicht, ich weiß es nicht.) Sie könnten einen Trigger definieren, der neue Daten in ein "Backlog" einfügt und die Prozedur die aggregierte Tabelle nur aus dem Backlog aktualisiert.

All diese Methoden werden im Detail in diesem Artikel beschrieben: Ссылка

    
Joni 26.07.2012, 19:04
quelle

Tags und Links