MySQL, dünyanın en popüler ilişkisel veritabanı yönetim sistemidir (RDBMS). Standart ayarlarla küçük sitelerde sorun yaşatmasa da trafiği yüksek projelerde RAM tüketimi, yavaş sorgular ve disk okuma problemlerine yol açar. Bu rehberde `my.cnf` ayarları ile MySQL (ve MariaDB) veritabanı motorunuzun potansiyelini ortaya çıkaracağız.
MySQL Neden Yavaşlar?
- Yanlış Bellek Tüketimi: İhtiyacından fazla RAM harcayarak sunucuyu felç etmesi.
- I/O Darboğazları: Sorguların RAM (bellek) yerine Disk'ten okunması.
- Sorgu Cache Kapalı Olması (Query Cache): Aynı sorgunun tekrar tekrar çalıştırılması.
- Bağlantı Sayıları (Max Connections): Aşırı bağlantı yükünün yönetilememesi.
Adım 1: MySQLTuner ile Analiz
Körlemesine ayar yapmak yerine, verileri ile rehberlik etmesi için MySQLTuner aracını kurarak başlayalım.
# MySQLTuner aracını indiriyoruz
sudo apt install mysqltuner
# Çalıştır
mysqltuner
Bu araç size aşağıdaki gibi çıktılar verir:
[!!] Maximum possible memory usage: 1.5G (78% of installed RAM)
[!!] InnoDB buffer pool / data size: 128.0M/1.2G
[OK] Highest usage of available connections: 15% (22/151)
Yukarıdaki örnekte InnoDB buffer size sorunlu; data size 1.2G iken ram de 128M ayrılmış. Bu, büyük bir I/O darboğazı anlamına gelir.
Adım 2: InnoDB Buffer Pool Ayarı (En Kritik Adım)
InnoDB veritabanı motoru için, okuma işlemlerini disk üzerinden yapmak yerine tahsis edilen bu hafızadan (RAM) yapar. RAM kullanma limitinin büyük bir kısmı buraya ayrılmalıdır.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Veya MariaDB kullanıyorsanız
# sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
# Sunucu RAM'inin %60-70'i oranına çıkarılmalıdır (Eğer DB Odaklı Bir Sunucuysa)
# Örn: 4GB RAM için;
innodb_buffer_pool_size = 2G
# Kaç process'e böleceğimiz (Her 1GB buffer için 1 idael, max 8)
innodb_buffer_pool_instances = 2
💡 NVMe Performansı Veritabanları İçin Hayatidir
Veritabanınız RAM'den yanıtlamadığı büyük verilerde diske güvenmek zorundadır. HazalHost VDS sunucularında gelen standart NVMe disk altyapısı sayesinde MySQL I/O gecikmelerini de minimize edersiniz.
Adım 3: Max Connections & Query Cache Ayarı
# Varsayılanı 151'dir. Trafik yükünüze göre artırmanızda fayda var
max_connections = 300
# Toplam ram kullanımını inanılmaz arttırabileceği için dikkatli büyüt
# Aşağıdaki değer idealdir:
open_files_limit = 4096
table_open_cache = 2000
# Geçici tablo boyutu
tmp_table_size = 64M
max_heap_table_size = 64M
Adım 4: Transaction & Log Optimizasyonu
# Binlog (Binary log) genelde Master-Slave mimarisinde replikasyon için kullanılır.
# Eğer Replication yapmıyorsanız kapatmak disk IO kullanımını ciddi derecede ferahlatır
disable_log_bin
# Ya da logların rotasyonunu hızlı silmek için ayarlayın (örnk: 3 gün)
# expire_logs_days = 3
# Innodb Log File Size - Yüksek yazma işlemlerinde performansı artırır (Backup alındıktan sonra bu işlem yapılmalıdır!)
innodb_log_file_size = 256M
# İnnodb commit optimizasyonu (Veriyi önce Ram'e yazar her saniye içi Diske Flush Eder)
# ACID prensibini bir tık bozsa da yüksek I/O kazancı sağlar.
innodb_flush_log_at_trx_commit = 2
Adım 5: Değişiklikleri Uygulama
Değişikliklerin onaylanması için sunucu yeniden başlatılmalıdır.
# Servisi yeniden başlat
sudo systemctl restart mysql
# veya
sudo systemctl restart mariadb
# Durumunu kontrol et
sudo systemctl status mysql
🚀 Limitsiz Veritabanı Projesi? Limitsiz Altyapı.
Performanslı bir veritabanı altyapısı devasa RAM ihtiyacı doğurur. HazalHost güvencesiyle siteleriniz performans odaklı VDS yapısıyla her yüke anında cevap versin.
Sonuç
MySQL performans optimizasyonu rastgele değerler girilerek yapılmaz, projenizin trafik hacmine göre şekillendirilmelidir. En yüksek performansa innodb_buffer_pool_size oranını optimize ederek ulaşabilirsiniz. İdeal sistemlerde, Veritabanı (DB) farklı VDS'de, Web App (Nginx, PHP) farklı VDS'te çalıştırılarak kaynak ayrımı (Microservice vari) yapılmalıdır.
Sık Sorulan Sorular (FAQ)
innodb_buffer_pool_size değerini çok yüksek tutarsam ne olur?
Eğer değer sistem RAM'inden veya OOM (Out Of Memory) standartlarından büyük kalırsa Linux OOM Killer mekanizması devreye girip MySQL processini direk (kill) edip durdurabilir. Web server vb uygulamalara ram kalmaz. Ayarlarken sistemdeki kullanılması olası diğer uygulamalara da rezervasyon yapmalısınız.
Max Connections "Too many connections" hata alıyorum
Bu problemin 2 sebebi olur; Çok yüksek hit aldığınızda max_connections sınırını aşmış olabilirsiniz, ya da kodlama tarafında veritabanı bağlantılarınız open kaldıktan sonra, bitiminde close edilmiyor, timeout süreleri bekleniyor olabilir.
MyISAM tablolarını InnoDB yapmalı mıyım?
InnoDB, transaction (işlem) blokları sırasında tablonun tamamı (table-lock) yerine sadece ilgili satırı günceller (row-level-lock) bu yüzden modern uygulamalarda InnoDB mutlak tavsiye edilir.