Ich habe seit einigen Monaten bei meinem Spiel AirlineSim ein ernstes Datenbankproblem, mir fehlt aber etwas das entsprechende Know-How um ihm zu begegnen. Evt. können die studierten Informatiker in dieser Runde etwas dazu sagen.
Folgende Situation:
Auf einem durchschnittlichen Server von AS finden pro Woche etwa 1 Million Flüge unter rund 170 bis 180-tausend Flugnummern statt. Immer wenn ein Flug durchgeführt wurde, wird für die laufende Kalenderwoche ein Statistikeintrag für die Flugnummer mit verschiedenen Werten angelegt bzw. ergänzt (Umsatz, Kapazität und Buchungen für Passagiere in Economy, Business, First sowie Fracht, Transferstatistiken (wieviele Passagiere von Partnerflügen, wieviele originär etc.), Anzahl Flüge usw.). Diese Einträge werden für 30 Wochen vorgehalten, um daraus Statistiken generieren zu können. In der Tabelle liegen also in aller Regel mehrere Gigabyte an Daten in zig Millionen Zeilen. Indizes gibt es für die Kalenderwoche, die Airline, die Allianz (if any), Ursprungsflughafen, Zeilflughafen und die Flugnummer. Die Statistiken können vielfältig sein. Ein paar Beispiele:
- Auswertung über Umsatz, angebotene Kapazität und Auslastung für eine Flugnummer für alle Passagiere oder einzelne Klassen
- Das selbe für eine Route
- Allgemeine Airline Rankings nach angebotenen Kapazitäten oder Auslastung (global oder ab einem bestimmten Land)
- Auslastungsstatistiken für eine Niederlassung (Auslastungen für jede Route ab einer Niederlassung in dieser und der vergangenen Woche)
- Verkehrsentwicklung an einem Flughafen über die vergangenen X Wochen
- Marktanteile in einem Land oder an einem Flughafen nach Airline/Allianz oder Zielflughafen/Land
- und viele viele mehr....
Wie man sieht gibt es für diese Daten nicht "eine" Auswertungsmöglichkeit, sondern denkbar viele. Entsprechend lassen sich die Reports auch schlecht bis garnicht cachen. Mein Problem ist nun, dass einige Queries extrem langsam sind. Insbesondere bei großen Airlines und bei anspruchsvollen Reports haben wir Ladezeiten die inakzeptabel sind.
Mir ist bewusst, dass es kein Allheimmittel dafür geben wird, aber evt. habt ihr ein paar Tipps, wie man mit solch einem Problem in der Regel umgeht und ob ggf. andere Technologien als die allgemein genutzte sinnvoll wären. Hier noch ein paar Infos, die evt. hilfreich sein könnten:
- Fast alle Queries erfordern Aggregierungen
- Statistiken über Passagiere, also nicht eine einzelne Klasse, sondern Eco+Business+First erfordern eine Addierung der entsprechendn Spalten
- Für Sitz-/Frachtkilometer-Statistiken wird die Flugentfernung mitgespeichert, mit der in Queries multipliziert und dann aggregiert wird
- Statistiken auf höheren geographischen Ebenen als Flughäfen (Land, Kontinent) werden per Join über die Airport-Tabelle ermöglicht
- Datenbank ist MySQL, Storage-Engine ist InnoDB
- Daten werden i.a.R. ein mal pro Minute geschrieben (also deutlich weniger writes als reads)
Wenn noch mehr Infos benötigt werden, einfach melden.
Vielen Dank für eure Hilfe!