MySQL Performansı Nasıl Optimize Edilir
MySQL veritabanı performansını optimize etme hakkında eksiksiz kılavuz: yapılandırma ayarlama, sorgu optimizasyonu, indeksleme ve izleme.

MySQL performans optimizasyonu, büyük miktarda veri veya yüksek trafik işleyen uygulamalar için kritiktir. Bu kılavuz, yapılandırma ayarlamadan sorgu optimizasyonuna kadar MySQL performansını iyileştirmek için temel teknikleri kapsar.
MySQL Yapılandırmasını Optimize Etme
Sunucu kaynaklarınıza göre performansı optimize etmek için MySQL yapılandırma dosyasını düzenleyin:
# MySQL yapılandırmasını düzenle (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# MySQL yapılandırmasını düzenle (CentOS/RHEL)
sudo nano /etc/my.cnf
# Bu ayarları ekle veya değiştir:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M
# MySQL'i yeniden başlat
sudo systemctl restart mysql # Ubuntu/Debian
sudo systemctl restart mysqld # CentOS/RHELInnoDB Optimizasyonu
InnoDB, MySQL'in varsayılan depolama motorudur. Daha iyi performans için optimize edin:
# /etc/mysql/mysql.conf.d/mysqld.cnf veya /etc/my.cnf dosyasında
[mysqld]
# InnoDB buffer pool (mevcut RAM'in %70-80'ini kullan)
innodb_buffer_pool_size = 2G
# InnoDB log dosyası boyutu
innodb_log_file_size = 512M
# InnoDB flush yöntemi (SSD için)
innodb_flush_method = O_DIRECT
# InnoDB I/O thread'leri
innodb_read_io_threads = 4
innodb_write_io_threads = 4
# İşlem commit'inde InnoDB log flush
innodb_flush_log_at_trx_commit = 2Sorgu Önbelleği Yapılandırması
Sorgu önbelleği okuma ağırlıklı iş yükleri için performansı artırabilir (Not: Sorgu önbelleği MySQL 8.0'da kullanımdan kaldırılmıştır):
# MySQL 5.7 ve önceki sürümler için
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# Sorgu önbelleği durumunu kontrol et
mysql> SHOW VARIABLES LIKE 'query_cache%';
# Sorgu önbelleği istatistiklerini kontrol et
mysql> SHOW STATUS LIKE 'Qcache%';İndeks Optimizasyonu
Doğru indeksleme sorgu performansı için kritiktir:
# İndeks istatistiklerini güncellemek için tabloyu analiz et
ANALYZE TABLE table_name;
# Kullanılmayan indeksleri kontrol et
SELECT * FROM sys.schema_unused_indexes;
# İndeks oluştur
CREATE INDEX idx_column ON table_name(column_name);
# Bileşik indeks oluştur
CREATE INDEX idx_multi ON table_name(col1, col2, col3);
# İndeksleri göster
SHOW INDEXES FROM table_name;
# Kullanılmayan indeksi sil
DROP INDEX idx_name ON table_name;Sorgu Optimizasyonu
Daha iyi performans için SQL sorgularınızı optimize edin:
- Sorgu yürütme planlarını analiz etmek için EXPLAIN kullanın: EXPLAIN SELECT * FROM table WHERE column = 'value'
- SELECT * kullanmaktan kaçının - yalnızca gerekli sütunları seçin
- Sonuç kümelerini sınırlandırmak için LIMIT kullanın
- İndekslenmiş sütunlarla uygun WHERE yan tümceleri kullanın
- WHERE yan tümcelerinde fonksiyon kullanmaktan kaçının (örn. WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
- Mümkün olduğunda alt sorgular yerine JOIN'ler kullanın
- Uygun olduğunda birden fazla koşul için OR yerine UNION kullanın
MySQL Performansını İzleme
# MySQL durumunu kontrol et
mysql> SHOW STATUS;
# Yavaş sorguları kontrol et
mysql> SHOW VARIABLES LIKE 'slow_query%';
# Yavaş sorgu günlüğünü etkinleştir
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
# İşlem listesini kontrol et
mysql> SHOW PROCESSLIST;
# Tablo durumunu kontrol et
mysql> SHOW TABLE STATUS LIKE 'table_name';
# InnoDB durumunu kontrol et
mysql> SHOW ENGINE INNODB STATUS;Performans Optimizasyon İpuçları
- Tabloları parçalara ayırmak için düzenli olarak OPTIMIZE TABLE çalıştırın
- Yavaş sorgu günlüğünü izleyin ve yavaş sorguları optimize edin
- Bağlantı yükünü azaltmak için bağlantı havuzlama kullanın
- Daha iyi performans için büyük tabloları tarih veya aralığa göre bölümleyin
- Okuma ağırlıklı iş yükleri için okuma replikaları kullanın
- MySQL'i en son kararlı sürüme güncel tutun
- Disk I/O'yu izleyin ve SSD/NVMe depolama kullanmayı düşünün
- Detaylı sorgu analizi için EXPLAIN ANALYZE (MySQL 8.0+) kullanın