Bir oyun sunucusunda en sinsi performans sorunu genellikle koddan değil, veritabanından gelir. Binlerce oyuncu aynı anda giriş yaptığında, indekslenmemiş tek bir sorgu tüm sunucuyu kilitleyebilir. MySQL optimizasyonu, Runa2 gibi yoğun bir Metin2 sunucusunu ayakta tutmanın en kritik parçalarından biridir. İşte temel ilkeler.
Önce ölç: EXPLAIN ve yavaş sorgu logu
Tahminle optimize etme — ölç. MySQL'in slow query log'unu açarak yavaş sorguları yakala, sonra her birini EXPLAIN ile incele. EXPLAIN, MySQL'in sorguyu nasıl çalıştırdığını ve bir index kullanıp kullanmadığını gösterir.
Index'ler: en büyük kazanç
Index, bir kitabın dizini gibidir: MySQL'in tüm tabloyu taramak yerine doğrudan satıra gitmesini sağlar. WHERE, JOIN ve ORDER BY'da kullandığın sütunları indeksle:
-- Yavas sorguyu incele
EXPLAIN SELECT * FROM player WHERE name = 'Aslain';
-- "name" sutununa index ekle
CREATE INDEX idx_player_name ON player (name);
Index eklemeden önce EXPLAIN'de "ALL" (tam tarama) gören bir sorgu, index sonrası "ref" veya "range" ile çok daha hızlı çalışır.
SELECT * yapma + bileşik index
İhtiyacın olmayan sütunları çekmek bellek ve ağ israfıdır. Sadece gereken sütunları seç ve birden çok koşul için bileşik index kullan:
-- 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);
Bileşik index'te sütun sırası önemlidir: en seçici (en çok daraltan) koşulu öne koy.
Şema ve veri tipleri
- Doğru veri tipini seç — gereksiz büyük tipler (örneğin her yerde
BIGINT) yer ve hız kaybettirir. - Sık sorgulanan tabloları normalize et, ama aşırıya kaçma; bazen küçük bir tekrar (denormalizasyon) JOIN'lerden hızlıdır.
- Büyüyen log tablolarını periyodik olarak arşivle veya böl.
Bakım ve dayanıklılık
- Düzenli yedek al (cron + mysqldump); oyun sunucusunda veri kaybı geri dönülmezdir.
- Tablolar büyüdükçe
ANALYZE TABLEile istatistikleri güncel tut. - Bağlantı havuzu ve uygun
max_connectionsile ani yükleri karşıla.
Sık Sorulan Sorular
Her sütuna index eklesem olmaz mı?
Hayır. Her index, yazma (INSERT/UPDATE) işlemlerini yavaşlatır ve yer kaplar. Sadece sorgularda gerçekten kullanılan sütunları indeksle.
MyISAM mı InnoDB mı?
Modern sunucularda InnoDB önerilir: satır bazlı kilitleme ve transaction desteğiyle yoğun yazma altında daha güvenlidir.
Yavaşlığın koddan mı veritabanından mı geldiğini nasıl anlarım?
Slow query log ve sunucu metrikleri (CPU, I/O) ile başlar; çoğu zaman birkaç indekssiz sorgu suçludur.
Sunucun yük altında yavaşlıyor mu? Veritabanı optimizasyonu ve sorgu ayarı konusunda yardımcı olabilirim — benimle iletişime geç.