MySQL Slow Query Log Analizi: Performans Darboğazlarını Tespit ve İndeks Optimizasyon Stratejileri
MySQL veritabanı performansını optimize etmek, özellikle yüksek yüklü sistemlerde kritik öneme sahiptir. Veritabanı sunucularında karşılaşılan yavaşlamaların temelinde genellikle optimize edilmemiş sorgular yatar. Bu tür sorguları tespit etmenin ve gidermenin en etkili yolu, MySQL Slow Query Log'larını analiz etmek ve ardından uygun indeks optimizasyon stratejilerini uygulamaktır.
Yavaş Sorgu Loglarını Etkinleştirme ve Yapılandırma
MySQL, varsayılan olarak yavaş sorgu loglarını kapalı tutar. Performans sorunlarının izlenebilmesi için bu özelliği etkinleştirmek ve doğru şekilde yapılandırmak ilk adımdır. Yapılandırma genellikle MySQL'in ana yapılandırma dosyası olan my.cnf (veya my.ini) üzerinden yapılır.
[mysqld]log_slow_queries = ON # MySQL 5.6 ve öncesi için geçerli. MySQL 5.7+ için slow_query_log kullanın.slow_query_log = 1 # Yavaş sorgu logunu etkinleştirir.slow_query_log_file = /var/log/mysql/mysql-slow.log # Log dosyasının yolunu belirtir.long_query_time = 1 # Sorguların kaç saniyeden uzun sürerse yavaş kabul edileceğini belirler (float değeri olabilir).log_queries_not_using_indexes = 1 # İndeks kullanmayan sorguları da loglar (çok faydalıdır).min_examined_row_limit = 100 # Sadece belirli sayıda satırı tarayan sorguların loglanmasını engeller.long_query_time değeri genellikle 1-2 saniye olarak ayarlanır, ancak uygulama gereksinimlerine ve beklenen yanıt sürelerine göre 0.1 gibi daha düşük değerlere de ayarlanabilir. Yapılandırma değişikliği sonrası MySQL servisinin yeniden başlatılması gerekir.
Yavaş Sorgu Loglarını Analiz Etme Araçları
Yavaş sorgu logları, metin tabanlı büyük dosyalar halinde tutulur. Bu dosyaları manuel olarak incelemek pratik değildir. Bu nedenle, logları anlamlı raporlara dönüştüren araçlar kullanılır.
mysqldumpslow Kullanımı
MySQL'in kendi bünyesinde gelen basit bir analiz aracıdır. Temel istatistikleri sunar ve en yavaş sorguları gruplandırarak özetler.
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.logBu komut, toplam süresine (t) göre sıralanmış en yavaş 10 sorguyu gösterir. Çıktı, parametreleri normalize edilmiş sorgu kalıplarını, bu kalıbın kaç kez çalıştığını, ortalama çalışma süresini ve kilitlenme süresini içerir. Basit durumlar için yeterli olsa da, derinlemesine analiz için sınırlıdır.
pt-query-digest ile Derinlemesine Analiz
Percona Toolkit'in bir parçası olan pt-query-digest, çok daha kapsamlı ve detaylı analiz raporları sunar. Sorguları, yürütme süreleri, kilit süreleri, taranan satır sayıları ve sonuç kümesi boyutları gibi birçok kritere göre gruplandırır ve sıralar.
pt-query-digest --report --limit 10 --since '2023-01-01 00:00:00' --until '2023-01-01 23:59:59' /var/log/mysql/mysql-slow.log > slow_query_report.txtBu komut, belirli bir zaman aralığındaki logları analiz ederek en yavaş 10 sorgunun detaylı bir raporunu slow_query_report.txt dosyasına kaydeder. Rapor, her bir sorgu kalıbı için yüzde dağılımları, taranan ve döndürülen ortalama satır sayıları, geçici tablo/dosya kullanımı gibi kritik metrikleri içerir. Bu metrikler, sorgunun neden yavaş çalıştığına dair güçlü ipuçları sağlar.
EXPLAIN Komutu ile Sorgu Planını Anlama
Yavaş bir sorguyu tespit ettikten sonraki adım, o sorgunun veritabanı tarafından nasıl yürütüldüğünü anlamaktır. EXPLAIN komutu, bir SELECT, INSERT, UPDATE veya DELETE sorgusunun yürütme planını detaylı olarak gösterir.
EXPLAIN SELECT * FROM urunler WHERE kategori_id = 10 AND fiyat > 50 ORDER BY stok DESC;EXPLAIN çıktısındaki anahtar sütunlar şunlardır:
id: Sorgu içindeki herSELECTiçin benzersiz bir tanımlayıcı.select_type: Sorgu tipini gösterir (SIMPLE, PRIMARY, SUBQUERY, DERIVED vb.).table: İşlem yapılan tablo.partitions: Bölümlenmiş tablolarda hangi bölümlerin etkilendiği.type: En kritik alanlardan biridir. Tabloya erişim yöntemini belirtir.ALL: Tam tablo taraması. Genellikle en kötü performans.index: Tam indeks taraması.ALL'dan iyi, ancak hala maliyetli.range: Belirli bir indeks aralığı taranır. İyi performans.ref: Eşitlik karşılaştırmalarında indeks kullanımı. Çok iyi performans.eq_ref: Birleştirme (JOIN) işleminde indeksin benzersiz bir eşleşme sağlaması. Mükemmel performans.const/system: Sadece bir satırın eşleştiği durumlar. En iyi performans.
possible_keys: MySQL'in bu sorgu için kullanmayı düşündüğü indeksler.key: MySQL'in gerçekten kullandığı indeks.key_len: Kullanılan indeksin en uzun parçasının uzunluğu.ref:keyile karşılaştırılan kolon veya sabit değer.rows: MySQL'in tahmini olarak tarayacağı satır sayısı. Düşük olması tercih edilir.filtered: Tahmini olarak filtrelenen satırların yüzdesi.Extra: Ek bilgiler. Önemli değerler arasında