Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Aufteilen einer großen Tabelle in Partitionen oder separate Tabellen?

Nun, wenn Sie auf eine neue Antwort hoffen, bedeutet das, dass Sie wahrscheinlich meine Antworten gelesen haben, und ich klinge wie eine kaputte Schallplatte. Siehe Partitionierungs-Blog für die wenigen Anwendungsfälle, in denen die Partitionierung die Leistung verbessern kann. Ihre nicht klingt wie einer der 4 Fälle.

device_id verkleinern . INT ist 4 Bytes; Haben Sie wirklich Millionen von Geräten? TINYINT UNSIGNED ist 1 Byte und hat einen Bereich von 0..255. SMALLINT UNSIGNED ist 2 Bytes und hat einen Bereich von 0..64K. Das wird die Tabelle etwas verkleinern.

Wenn Ihr echt Frage ist, wie man so viele Daten verwaltet, dann lassen Sie uns "um die Ecke denken". Lesen Sie weiter.

Grafische Darstellung... Welche Datumsbereiche stellen Sie grafisch dar?

  • Die 'letzte' Stunde/Tag/Woche/Monat/Jahr?
  • Eine beliebige Stunde/Tag/Woche/Monat/Jahr?
  • Ein beliebiger Bereich, der nicht an Tag/Woche/Monat/Jahr-Grenzen gebunden ist?

Was stellen Sie grafisch dar?

  • Durchschnittswert über einen Tag?
  • Max/Min über den Tag?
  • Kerzenhalter (usw.) für Tag oder Woche oder was auch immer?

In jedem Fall sollten Sie eine Übersichtstabelle mit Daten erstellen (und inkrementell pflegen). Eine Zeile enthält zusammenfassende Informationen für eine Stunde. Ich würde vorschlagen

CREATE TABLE Summary (
    device_id SMALLINT UNSIGNED NOT NULL,
    sensor_id TINYINT UNSIGNED NOT NULL,
    hr TIMESTAMP NOT NULL,
    avg_val FLOAT NOT NULL,
    min_val FLOAT NOT NULL,
    max_val FLOAT NOT NULL
    PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;

Die eine Zusammenfassungstabelle kann 9 GB groß sein (für die aktuelle Datenmenge).

SELECT hr,
       avg_val,
       min_val,
       max_val
    FROM Summary
    WHERE device_id = ?
      AND sensor_id = ?
      AND hr >= ?
      AND hr  < ? + INTERVAL 20 DAY;

Würde Ihnen die hi/lo/avg-Werte für 480 Stunden geben; genug zum grafisch darstellen? Das Abrufen von 480 Zeilen aus der Übersichtstabelle ist viel schneller als das Abrufen von 60 * 480 Zeilen aus der Rohdatentabelle.

Ähnliche Daten für ein Jahr zu erhalten, würde wahrscheinlich ein Grafikpaket ersticken, also kann Es lohnt sich, eine Zusammenfassung der Zusammenfassung zu erstellen - mit einer Auflösung von einem Tag. Das wären etwa 0,4 GB.

Es gibt verschiedene Möglichkeiten, die Übersichtstabelle(n) zu erstellen; wir können darüber diskutieren, nachdem Sie über seine Schönheit nachgedacht und den Summary tables blog . Es kann sein, dass das Sammeln von Daten im Wert von einer Stunde und das anschließende Erweitern der Zusammenfassungstabelle der beste Weg ist. Das wäre so etwas wie der Flip-Flop, der in meinem Staging-Tabellen-Blog diskutiert wird .

Und wenn Sie die stündlichen Zusammenfassungen hätten, brauchen Sie dann wirklich die minutengenauen Daten? Ziehe in Betracht, es wegzuwerfen. Oder vielleicht Daten nach, sagen wir, einem Monat. Das führt zur Verwendung der Partitionierung, aber nur zu ihrem Vorteil beim Löschen alter Daten wie in "Fall 1" von Blog partitionieren besprochen . Das heißt, Sie hätten tägliche Partitionen mit DROP und REORGANIZE jede Nacht, um die Zeit des "Fakten"-Tisches zu verschieben. Dies würde zu einer Verringerung Ihres 145-GB-Fußabdrucks führen, ohne jedoch viele Daten zu verlieren. Neuer Footprint:ca. 12 GB (stündliche Zusammenfassung + minutengenaue Details der letzten 30 Tage)

PS:Der Summary Table-Blog zeigt, wie man die Standardabweichung erhält.