Heute wollte ich euch noch mal etwas technisch anspruchvolleres nahebringen.
Das Thema: Indizes in MySQL
Zunächst einmal eine kleine Erklärung, was das bringt:
Aber das sei erst einmal genug der Theorie.
Hier jetzt mal das (bei Metin2 wohl denkbar beste) Beispiel dazu:
Die "player.item"-Tabelle:
Betritt ein Spieler den Server, so werden unter anderem alle seine Items aus der Datenbank abgerufen. In vereinfachter Form sieht das etwa so aus:
Code:
SELECT * FROM player.item WHERE owner_id = 12345;
- gesucht wird anhand der gegebenen "owner_id",
- es ist nicht bekannt, wie viele Ergebnisse die Query haben wird,
- die gesuchten Datensätze könnten überall in der Tabelle zu finden sein.
Daraus ergibt sich, dass zur Ausführung dieser simplen Query die gesamte "item"-Tabelle gelesen und durchsucht werden muss.
Bei einem gut besuchten Server können das gut zigtausende bis Millionen von Datensätzen (Items) sein.
Da ein Spieler einen Server nur recht selten betritt, bringt das Verbleiben der Ergebnisse im RAM sehr wenig.
Ganz im Gegenteil: für jeden Spieler muss erneut die gesamte Tabelle durchsucht werden.
Hier kommen jetzt Indizes ins Spiel:
Da die meisten Queries wie oben beschrieben als Suchkriterium das Feld "owner_id" besitzen, ist es sinnvoll einen Index über jenes Feld anzulegen.
Dann können in diesem Index sehr schnell alle gesuchten Datensätze anhand des Feldes "owner_id" gefunden werden (Erinnerung: der Index mit dem Schlüssel "owner_id" ist nach dessen Größe aufsteigend sortiert).
Die Suche des richtigen Bereiches im Index kann mit (vergleichsweise) simplen größer-/kleiner-Vergleichen durchgeführt werden.
Generell lassen sich das Problem und dessen Lösung auf viele andere Szenarien übertragen.
Ein sinnvoller Einsatz des Schemas wäre z.B. auch für die Tabelle "player.player" ein Index über das Feld "level".
Damit ließe sich eine Rangliste mit Level-Sortierung deutlich beschleunigen.
Einrichtung:
Vom Admin eines führenden Servers (ich weiß nicht ob er genannt werden will) habe ich bisher nur positive Rückmeldungen erfahren.
Vor der Einrichtung der Indizes beklagten sich Spieler über sehr lange Ladezeiten bei Mapwechseln und Login.
Ich hoffe, ich konnte euch ein wenig weiter bringen und euch näher an MySQL heranführen.
Vielleicht können einige meine beispielhaften Erläuterungen auf andere Anwendungsgebiete übertragen.
Durch richtige Datenpflege lässt sich einiges an Leistung aus MySQL herausholen und einige Vorgänge erheblich beschleunigen.
MfG,
~M@shkin
Blog-Post:
