Sunucunuzun özelliklerine ve kullanım senaryonuza göre optimum my.cnf yapılandırmasını hesaplar. InnoDB buffer pool, bağlantı havuzu ve onlarca parametre için kopyalamaya hazır çıktı üretir.
$ free -m | awk '/Mem:/ {print "Toplam RAM: "$2" MB, Kullanılan: "$3" MB"}'$ mysql -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_%';" | grep -E 'reads|read_requests'$ mysql -e "SHOW GLOBAL STATUS LIKE 'Max_used_connections';"
free -m ile öğrenin.
nproc ile öğrenin.
MySQL dışında başka servisler de çalışıyorsa “Karma” seçin.
I/O scheduler ve flush ayarları buna göre değişir.
PHP-FPM max_children × 1.1 formülünü kullanabilirsiniz.
0 bırakırsanız otomatik hesaplanır.
MySQL Performans Optimizasyonu Rehberi
MySQL/MariaDB performansının büyük çoğunluğu iki temel faktöre bağlıdır: InnoDB Buffer Pool boyutu ve bağlantı yönetimi. Doğru yapılandırılmış bir MySQL, aynı donanımda 5–10× daha iyi performans gösterebilir.
Temel Hesaplama Formülleri
InnoDB Buffer Pool = Kullanılabilir RAM × 0.70 (web/karma için) InnoDB Buffer Pool = Kullanılabilir RAM × 0.80 (dedicated MySQL için) Buffer Pool Instances = min(CPU çekirdek, buffer pool GB) thread_cache_size = min(100, max_connections × 0.50) Tahmini MySQL RAM = Buffer Pool + (max_conn × 2 MB) + 200 MB
innodb_buffer_pool_size — #1 Öncelik
MySQL performansının %80’ini belirler. Veritabanınız RAM’e sığıyorsa her sorgu diskten değil bellekten gelir. Bu değeri mümkün olduğunca büyük tutun — ancak sunucuyu çökmesine yol açmayacak kadar.
max_connections — Bağlantı Havuzu
Her bağlantı ~2 MB RAM tüketir. PHP-FPM max_children değerinizden biraz yüksek tutun. Çok yüksek değer sunucuyu öldürür; çok düşük değer “Too many connections” hatasına yol açar.
innodb_log_file_size — Yazma Performansı
Write-heavy uygulamalarda kritik. Değer büyüdükçe yazma hızı artar ama crash recovery süresi uzar. Önerim: 256 MB – 1 GB arası. MySQL 8’de otomatik yönetilir.
innodb_flush_log_at_trx_commit
1 = tam ACID güvenli, her commit’te disk yazması (yavaş, production default)
2 = OS cache’e yazar, saniyede 1 flush (önerilen denge)
0 = en hızlı, en riskli — crash’te 1 saniyelik veri kaybı olabilir
| Parametre | Açıklama | Önerilen |
|---|---|---|
| innodb_buffer_pool_size | InnoDB veri ve indeksleri için bellek havuzu. En kritik parametre. | RAM × 0.7 |
| innodb_buffer_pool_instances | Buffer pool’u parçalara böler, paralel erişim performansını artırır. | 4 – 8 |
| innodb_log_file_size | Redo log dosyası boyutu. Büyük değer yazma performansını artırır. | 256M – 1G |
| innodb_flush_log_at_trx_commit | Log flush stratejisi. 1=güvenli, 2=hızlı denge, 0=en hızlı+riskli. | 1 veya 2 |
| innodb_flush_method | Disk yazma metodu. Linux/SSD için O_DIRECT double buffering’i önler. | O_DIRECT |
| max_connections | Eş zamanlı bağlantı sayısı. Her bağlantı ~2 MB RAM kullanır. | 100 – 500 |
| thread_cache_size | Yeniden kullanılacak thread sayısı. Bağlantı kurma maliyetini düşürür. | max_conn × 0.5 |
| tmp_table_size / max_heap_table_size | GROUP BY, ORDER BY işlemleri için geçici tablo belleği. Aşılırsa disk kullanılır. | 64M – 256M |
| slow_query_log | Yavaş sorguları loglar. long_query_time değerini aşan sorgular kayıt edilir. | ON, 1 – 2s |
| query_cache_type | MySQL 5.7/MariaDB: yoğun write altında mutex sorununa yol açar, kapatılması önerilir. MySQL 8’de kaldırıldı. | 0 (kapalı) |
$ mysql -e "SELECT FORMAT(A.num*100.0/B.num,2) hit_rate FROM (SELECT variable_value num FROM information_schema.global_status WHERE variable_name='Innodb_buffer_pool_read_requests') A, (SELECT variable_value num FROM information_schema.global_status WHERE variable_name='Innodb_buffer_pool_reads') B;"
$ mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
systemctl restart mysql. Canlı ortamda mümkünse önce staging sunucuda test edin. Bazı değişkenler SET GLOBAL ile yeniden başlatmaya gerek kalmadan değiştirilebilir.
wget http://mysqltuner.pl -O mysqltuner.pl && perl mysqltuner.pl. Ancak bu hesaplayıcı gibi araçlar başlangıç noktasıdır; gerçek yükü izleyip ince ayar yapmanız gerekir.