aslain.dev
0%
← Tüm makaleler

MySQL-optimalisatie voor een gameserver met veel verkeer

Op een gameserver komt het sluwste performanceprobleem meestal niet uit de code maar uit de database. Wanneer duizenden spelers tegelijk inloggen, kan één niet-geïndexeerde query de hele server vastzetten. MySQL-optimalisatie is een van de meest kritieke onderdelen om een drukke Metin2-server als Runa2 draaiende te houden. Hier zijn de kernprincipes.

Meet eerst: EXPLAIN en de slow query log

Optimaliseer niet op gevoel — meet. Zet MySQL's slow query log aan om trage queries te vangen en inspecteer elke met EXPLAIN. EXPLAIN toont hoe MySQL de query uitvoert en of er een index wordt gebruikt.

Indexen: de grootste winst

Een index is als de index van een boek: MySQL gaat direct naar de rij in plaats van de hele tabel te scannen. Indexeer de kolommen die je gebruikt in WHERE, JOIN en ORDER BY:

-- Yavas sorguyu incele
EXPLAIN SELECT * FROM player WHERE name = 'Aslain';

-- "name" sutununa index ekle
CREATE INDEX idx_player_name ON player (name);

Een query die "ALL" (volledige scan) toont in EXPLAIN vóór een index draait daarna veel sneller als "ref" of "range".

Vermijd SELECT * + gebruik composite indexen

Kolommen ophalen die je niet nodig hebt verspilt geheugen en netwerk. Selecteer alleen de nodige kolommen en gebruik een composite index voor meerdere voorwaarden:

-- 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);

In een composite index telt de kolomvolgorde: zet de meest selectieve (meest beperkende) voorwaarde voorop.

Schema en datatypes

  • Kies het juiste datatype — onnodig grote types (zoals overal BIGINT) kosten ruimte en snelheid.
  • Normaliseer vaak bevraagde tabellen, maar overdrijf niet; soms is wat herhaling (denormalisatie) sneller dan JOINs.
  • Archiveer of partitioneer groeiende logtabellen periodiek.

Onderhoud en veerkracht

  • Maak regelmatig back-ups (cron + mysqldump); op een gameserver is dataverlies onomkeerbaar.
  • Houd statistieken actueel met ANALYZE TABLE naarmate tabellen groeien.
  • Vang pieken op met een connection pool en een verstandige max_connections.

Veelgestelde vragen

Kan ik niet gewoon elke kolom indexeren?

Nee. Elke index vertraagt schrijfacties (INSERT/UPDATE) en kost ruimte. Indexeer alleen kolommen die queries echt gebruiken.

MyISAM of InnoDB?

Op moderne servers wordt InnoDB aanbevolen: met row-level locking en transactiesteun is het veiliger onder zware schrijfbelasting.

Hoe weet ik of traagheid uit code of database komt?

Begin met de slow query log en servermetrieken (CPU, I/O); meestal zijn een paar niet-geïndexeerde queries de boosdoener.

Wordt je server traag onder belasting? Ik kan helpen met database-optimalisatie en query-tuning — neem contact op.

Devamı için