Auf einem Spielserver kommt das heimtückischste Performanceproblem meist nicht aus dem Code, sondern aus der Datenbank. Wenn sich Tausende Spieler gleichzeitig einloggen, kann eine einzige nicht indexierte Abfrage den ganzen Server blockieren. MySQL-Optimierung ist einer der kritischsten Teile, um einen ausgelasteten Metin2-Server wie Runa2 am Leben zu halten. Hier die Grundprinzipien.
Erst messen: EXPLAIN und das Slow Query Log
Optimiere nicht nach Gefühl — miss. Aktiviere MySQLs Slow Query Log, um langsame Abfragen zu finden, und untersuche jede mit EXPLAIN. EXPLAIN zeigt, wie MySQL die Abfrage ausführt und ob ein Index genutzt wird.
Indizes: der größte Gewinn
Ein Index ist wie das Register eines Buches: MySQL springt direkt zur Zeile, statt die ganze Tabelle zu scannen. Indexiere die Spalten, die du in WHERE, JOIN und ORDER BY nutzt:
-- Yavas sorguyu incele
EXPLAIN SELECT * FROM player WHERE name = 'Aslain';
-- "name" sutununa index ekle
CREATE INDEX idx_player_name ON player (name);
Eine Abfrage, die in EXPLAIN vor einem Index „ALL" (Full Scan) zeigt, läuft danach als „ref" oder „range" viel schneller.
Vermeide SELECT * + nutze zusammengesetzte Indizes
Spalten zu holen, die du nicht brauchst, verschwendet Speicher und Netzwerk. Wähle nur die nötigen Spalten und nutze einen zusammengesetzten Index für mehrere Bedingungen:
-- Sadece gerekli sutunlar + bilesik (composite) index
SELECT id, level FROM player
WHERE empire = 1 AND level >= 90
ORDER BY level DESC;
CREATE INDEX idx_empire_level ON player (empire, level);
Bei einem zusammengesetzten Index zählt die Spaltenreihenfolge: stelle die selektivste (am stärksten einschränkende) Bedingung voran.
Schema und Datentypen
- Wähle den richtigen Datentyp — unnötig große Typen (wie überall
BIGINT) kosten Platz und Tempo. - Normalisiere oft abgefragte Tabellen, aber übertreibe nicht; manchmal ist etwas Wiederholung (Denormalisierung) schneller als JOINs.
- Archiviere oder partitioniere wachsende Log-Tabellen regelmäßig.
Wartung und Widerstandsfähigkeit
- Erstelle regelmäßige Backups (Cron + mysqldump); auf einem Spielserver ist Datenverlust unumkehrbar.
- Halte mit
ANALYZE TABLEdie Statistiken aktuell, wenn Tabellen wachsen. - Fange Lastspitzen mit einem Connection Pool und einem sinnvollen
max_connectionsab.
Häufige Fragen
Kann ich nicht einfach jede Spalte indexieren?
Nein. Jeder Index verlangsamt Schreibvorgänge (INSERT/UPDATE) und braucht Platz. Indexiere nur Spalten, die Abfragen wirklich nutzen.
MyISAM oder InnoDB?
Auf modernen Servern wird InnoDB empfohlen: mit Zeilensperren und Transaktionsunterstützung ist es bei vielen Schreibvorgängen sicherer.
Woran erkenne ich, ob die Langsamkeit aus Code oder Datenbank kommt?
Beginne mit dem Slow Query Log und Servermetriken (CPU, I/O); meist sind ein paar nicht indexierte Abfragen schuld.
Wird dein Server unter Last langsam? Ich helfe bei Datenbankoptimierung und Query-Tuning — kontaktiere mich.