2014-09-07 3 views
5

Wir haben eine MySQL-Tracking-Datenbank, die ~ 100M Reihen hat. Im Allgemeinen führen wir Abfragen für bestimmte Aktionen, einmalige Besuche usw. täglich durch. Das Problem besteht darin, dass Abfragen aufgrund des Zusammenspiels der Indizes langsam werden, um den monatlichen Bericht zu generieren (wir haben einen Bereichsscan für das Datum und dann Abfragen basierend auf mehreren andere Felder.)gibt es die Nachteile einer Nachverfolgungstabelle nach Datum?

Um die Leistung zu verbessern, haben wir auf der Grundlage des Datums auf Unionen umgestellt, um den Bereichsscan zu vermeiden, und die Leistung ist viel besser. So wurde die Idee präsentiert, dass wir vielleicht jeden Tag mit einer anderen Tabelle für jeden Tag shard werden sollten. Die Vorteile scheinen zu sein:

  • schnelle Einsätze - jeden Tag ist der Tisch neu/klein, so ist es immer schnell.
  • Löschen von alten Daten ist einfach (anstatt 5M Zeilen aus einer 100M Row-Tabelle zu löschen, können wir einfach eine Tabelle löschen)
  • Unser aktueller Ansatz ist Gewerkschaften sowieso - so sind wir nur unioning verschiedene Tabellen anstelle von verschiedenen Werten von einem Tisch.

Hat jemand diesen Ansatz gehört oder versucht? Gibt es vorhersehbare Probleme?

Hinweis: Wir erwägen andere NoSQL-Ansätze - aber wir würden gerne wissen, ob dies ein gültiger Ansatz ist, wenn wir uns für MySQL entscheiden (also bitte nicht "XYZ noSQL DB ausprobieren"). Außerdem verstehe ich, dass wir nur eine viel bessere Maschine bekommen können und dass dies im Rahmen von Datensätzen nicht so groß ist - aber wir wollen kein Geld für eine größere Maschine verschwenden, wenn eine kleinere ohne viel mehr arbeiten wird Arbeit.

+0

Wenn es Ihnen möglich ist, können Sie die täglichen Ergebnisse in einer separaten Tabelle speichern und dann die Berichtsabfrage ausführen. Wenn Sie auch wöchentliche Berichte erstellen (manchmal auch, wenn Sie dies nicht tun), kann es sich lohnen, wöchentliche Abfragen für die täglichen aggregierten Werte auszuführen und die Ergebnisse in einer weiteren wöchentlichen Tabelle zu speichern. Mit ein bisschen Fiedeln können Sie dann * nahezu * alle Informationen eines Zeitraums sofort erhalten (ich musste dies einmal tun, um Berichte über dynamische AJAX-Diagramme zu unterstützen). Für Speicher und INSERTs ist horizontale datumsbasierte Partitionierung Ihr Freund. – LSerni

Antwort

2

Es scheint, dass Sie sich MySQL Partitioning ansehen können.

Partitionierung ermöglicht es Ihnen, Teile einzelner Tabellen über ein Dateisystem nach Regeln zu verteilen, die Sie weitgehend nach Bedarf festlegen können. In der Tat sind verschiedene Teile einer Tabelle als separate Tabellen an verschiedenen Orten gespeichert. Die vom Benutzer ausgewählte Regel, mit der die Datenteilung durchgeführt wird, ist als Partitionierungsfunktion bekannt, die in MySQL der Modulus, einfache Übereinstimmung mit einer Reihe von Bereichen oder Wertelisten, eine interne Hash-Funktion oder eine lineare Hash-Funktion sein kann. Die Funktion wird entsprechend dem vom Benutzer angegebenen Partitionierungstyp ausgewählt und verwendet als Parameter den Wert eines vom Benutzer angegebenen Ausdrucks. Dieser Ausdruck kann ein Spaltenwert, eine Funktion sein, die auf einen oder mehrere Spaltenwerte wirkt, oder ein Satz aus einem oder mehreren Spaltenwerten, je nach Art der Partitionierung, die verwendet wird.
Es scheint eine in Ihrem Fall eine Hash-Partition im Monat Teil des Datums könnte nützlich sein.

CREATE TABLE Mydata (id INT, amount DECIMAL(7,2), tr_date DATE) 
    ENGINE=INNODB 
    PARTITION BY HASH(MONTH(tr_date)) 
    PARTITIONS 12; 

Die Partitionierungslösung wird konzeptionell wie Sie das gleiche sein, aber RDBMS werden viele Aspekte für Sie.

+0

Danke - das ist ein interessantes Werkzeug. Ich dachte immer an eine Partitionierung über mehrere Datenbanken hinweg. Dies funktioniert auch durch eine Datenbank? Muss ich mit den verschiedenen Partitionen anders reden oder die Datenbank wird das für mich erledigen? In unserem Fall wäre der Gedanke, eine Partition oder einen Splitter pro Tag zu verwenden, da wir sie so benutzen.Wir werden nicht mehr als ein paar Monate Daten haben - wäre diese Lösung gut, ~ 90 Partitionen zu haben? – Yehosef

+0

Es ist eine Fähigkeit von RDBMS (einzelne Datenbank). Die in PARTITIONS angegebene Nummer gibt nur an, wie viele physische Dateien am Partitionierungsprozess beteiligt sind. RDBMS übernimmt den Rest. Die obige Probe könnte mit PARKTIONEN 3 oder 6 durchgeführt werden und das Ergebnis ist das gleiche. –

Verwandte Themen