Ich habe ein Online-Spiel, in dem ich viele Gameplay-Statistiken aufzeichne. Diese Statistiktabellen werden sehr schnell groß, und ich muss vorsichtig sein, da das Aufzeichnen von mehr Statistiken dazu führen kann, dass die Leistung des Spiels ziemlich schlecht wird, sobald der Tisch groß genug ist.MySQL-Idee für High-Volume "Rotation" von Statistiken?
Meine Strategie, die nicht sehr gut ist, besteht darin, die Statistiktabellen klein zu halten. Ich habe einen automatischen Prozess, der alle 24 Stunden eine neue Tabelle erstellt, sodass die Leistung nicht zu sehr aus der Hand geht. Aber meine Lösung ist hässlich und ist eine Art "Rotation" von Statistiktabellen. Ich benutze innodb und habe ein paar Indizes eingerichtet, um die Leistung zu verbessern, und dann behalte ich nur 30 dieser Tabellen herum (jeder ist 24 Stunden, also spare ich einen Monat Statistik). Alle 24 Stunden löscht mein automatisierter Prozess die Tabelle "stats30", benennt dann alle nummerierten Tabellen in eine höhere Nummer um und erstellt dann eine neue, leere Tabelle namens "stats". Dies ist die "Live" -Tabelle, in der die Statistiken aktiv aufgezeichnet werden.
Diese Tabellen zeichnen im Grunde jede Transaktion zwischen jedem Spieler und jedem anderen Spieler im Spiel auf, mit dem sie interagieren, also eine exponentielle Datenexplosion. Wenn eine neue Transaktion auftritt, überprüft sie, ob es bereits eine Zeile für die Transaktionen zwischen diesen beiden Spielern während dieses Tages gibt. Wenn dies der Fall ist, aktualisiert es die Zeile mit Änderungen an ihren Transaktionen. Andernfalls wird eine neue Zeile erstellt. Ein Paar Spieler, die an einem Tag 1000-mal interagieren, und ein Paar, die nur einmal interagieren, haben für diesen Tag jeweils nur eine Zeile in der Tabelle. Jede Aktion in der Datenbank beinhaltet ein SELECT und dann entweder ein UPDATE oder ein INSERT, so dass es ziemlich genau zwischen Lese- und Schreibvorgängen wie aktuell entworfen ist. Das Lesen von Daten in einem größeren Sinn, d. H. Für die Analyse von Statistiken und mehreren Spielern, wird sehr selten im Vergleich zu den einzelnen SELECTs, UPDATEs und INSERTs durchgeführt. Es werden ungefähr 150.000 Zeilen pro Tag erstellt.
Ich weiß, das könnte besser sein. Ich kann die Menge der Daten, die ich aufnehme, nicht so leicht reduzieren, aber ich mache mir Gedanken über die 1. Leistung und 2. Einfachheit. Ich könnte die Leistung sogar noch steigern, indem ich zum Beispiel alle 4 Stunden einen neuen Tisch kreiere, aber dann muss ich mich mit 180 Tischen messen. Umgekehrt könnte ich es einfacher machen, indem ich nur einen Tisch benutze, und dann hört alles krachend auf.
Beachten Sie, dass ich Zeilen in diesen Tabellen aktualisieren muss, so dass ich nicht so etwas wie die ARCHIVE-Speicher-Engine verwenden kann, aber ich muss nur auf die "Live" Statistik-Tabelle INSERT oder UPDATE.
Es gibt auch das kleinere Problem, dass wenn der tägliche Rotationsprozess auftritt, alle Anfragen, die zu diesem Zeitpunkt eingehen, verloren gehen können. (Wenn Sie alle Tabellen umbenennen und eine neue erstellen, können neue Einträge fehlschlagen.) Das Verlieren einiger Einfügungen ist kein großes Problem, sondern eine Lösung, bei der dieser Fehler nicht auftritt oder "atomisch" ausgeführt werden kann " wäre besser.
Danke für alle Ideen, die helfen könnten! :)
Wie viele Zeilen haben Sie pro Tag? Sind sie einmal gelesen - viele Male? Dh, sobald Sie eine Zeile in der DB schreiben, wird sie jemals aktualisiert? – idrosid
Ich bin ziemlich skeptisch, dass die Leistung von MySQL hier der eigentliche Flaschenhals ist. – Pesto
Es sieht so aus, als ob du ein riesiges Durcheinander verursachst. Sie sollten das vollständig fallen lassen und JQUERY verwenden! – belgariontheking