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.
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