MySQL Slow Query Log ile Yavaş Sorguları Tespit Etme

MySQL veritabanı yönetiminde performans optimizasyonu, modern uygulamaların vazgeçilmez bir parçasıdır.

MySQL veritabanı yönetiminde performans optimizasyonu, modern uygulamaların vazgeçilmez bir parçasıdır. Yavaş çalışan sorgular, sistem kaynaklarını gereksiz yere tüketerek kullanıcı deneyimini olumsuz etkiler ve ölçeklenebilirliği sınırlar. MySQL’in sunduğu Slow Query Log özelliği, bu sorunları proaktif bir şekilde tespit etmek için güçlü bir araçtır. Bu log, belirlenen süre aşımından uzun süren sorguları kaydeder ve veritabanı yöneticilerine detaylı analiz imkanı sağlar. Bu makalede, Slow Query Log’u etkinleştirme, analiz etme ve yavaş sorguları optimize etme süreçlerini adım adım inceleyeceğiz. Böylece, veritabanı performansınızı sistematik olarak iyileştirebilirsiniz.

Slow Query Log’u Etkinleştirme ve Yapılandırma

Slow Query Log’u etkinleştirmek, MySQL sunucusunun konfigürasyon dosyasını (genellikle my.cnf veya my.ini) düzenleyerek başlar. Bu dosyanın [mysqld] bölümüne slow_query_log = 1 satırını ekleyin. Ardından, long_query_time parametresini saniye cinsinden belirleyin; örneğin long_query_time = 2, 2 saniyeden uzun süren sorguları loglayacaktır. Log dosyasının konumunu slow_query_log_file = /var/log/mysql/slow.log ile tanımlayın. Ek olarak, log_queries_not_using_indexes = 1 ekleyerek indeks kullanmayan sorguları da yakalayabilirsiniz. Değişiklikleri uygulamak için MySQL servisini yeniden başlatın: sudo systemctl restart mysql.

Bu ayarlar etkinleştirildikten sonra, log dosyası otomatik olarak oluşmaya başlar. Önemli bir nokta, log_queries_not_using_indexes’in etkin olmasıdır; bu, potansiyel indeksleme fırsatlarını ortaya çıkarır. Ayrıca, min_examined_row_limit parametresiyle (örneğin 1000), incelenen satır sayısı eşiğini belirleyerek gereksiz loglamayı önleyebilirsiniz. Bu yapılandırma, üretim ortamlarında dikkatli yapılmalıdır; log dosyası hızla büyüyebileceğinden rotasyon mekanizmaları (logrotate) entegre edin. Pratikte, geliştirme ortamında long_query_time’i düşük tutarak (1 saniye) test edin ve üretime uyarlayın.

  • my.cnf dosyasına ekleyin: slow_query_log = 1, long_query_time = 2.
  • Servisi yeniden başlatın ve log dosyasını kontrol edin: tail -f /var/log/mysql/slow.log.
  • İndeksli sorguları loglamak için log_queries_not_using_indexes = 1 kullanın.

Log Dosyasını Analiz Etme Yöntemleri

mysqldumpslow ile Hızlı Özet Alma

MySQL’in yerleşik aracı mysqldumpslow, slow.log dosyasını özetler ve en yavaş sorguları sıralar. Komut satırından mysqldumpslow /var/log/mysql/slow.log | head -20 çalıştırarak en kötü 20 sorguyu listeleyin. Bu araç, sorgu sürelerini, çağrı sayılarını ve Lock süresini gösterir. Örneğin, çıktıdaki “Count: 1500 Time: 45.20s” satırı, bir sorgunun 1500 kez çağrıldığını ve toplam 45 saniye harcadığını belirtir. -s c (süreye göre sıralama) veya -t 10 (en üst 10) gibi seçeneklerle filtreleyin. Bu analiz, öncelikli optimizasyon hedeflerini belirlemenize yardımcı olur.

pt-query-digest ile Detaylı İnceleme

Percona Toolkit’in pt-query-digest aracı, daha gelişmiş analiz sunar. Kurulumu sonrası pt-query-digest /var/log/mysql/slow.log –review çalıştırın; bu, sorguları gruplar, fingerprint’ler oluşturur ve tam sorgu metinlerini gösterir. Örnek çıktı: “SELECT * FROM users WHERE id = ? # Lock: 0.01s Rows_sent: 1 Rows_examined: 100000”. Bu, tam tablo taramasını işaret eder. Araç, %95 percentile süreleri hesaplar ve rapor üretir. Düzenli cron job ile çalıştırarak haftalık raporlar alın: 0 2 * * * pt-query-digest /var/log/mysql/slow.log > /reports/weekly.txt.

Her iki araç da, sorgu kalıplarını (farklı parametrelerle aynı yapı) gruplayarak gürültüyü azaltır. Analiz sırasında, Execution Time, Rows examined ve Lock time sütunlarına odaklanın; yüksek rows examined, indeks eksikliğini gösterir.

Yavaş Sorguları Optimize Etme Adımları

Tespit edilen yavaş sorguları optimize etmek için önce EXPLAIN komutunu kullanın: EXPLAIN SELECT * FROM orders WHERE customer_id = 123. Bu, sorgu planını gösterir; “Using filesort” veya “Using temporary” uyarıları optimizasyon ihtiyacını işaret eder. İndeks ekleyin: ALTER TABLE orders ADD INDEX idx_customer (customer_id). Sorguyu yeniden yazın; örneğin LIMIT ekleyin veya JOIN’leri optimize edin.

İndeksleme ve Query Rewrite Teknikleri

İndeksler, en etkili optimizasyondur. Composite indeksler oluşturun: ALTER TABLE users ADD INDEX idx_name_email (name, email). Covering index ile SELECT alanlarını indeks içine alın. Query rewrite için, subquery’leri JOIN’e çevirin: SELECT u.name FROM users u JOIN orders o ON u.id = o.user_id yerine. Bu, %90’a varan hız artışı sağlar. Cache mekanizmaları (query_cache_type=1) ekleyin, ancak InnoDB için sınırlıdır.

Uzun Vadeli İzleme Stratejileri

Optimizasyon sonrası Performance Schema’yı etkinleştirin (performance_schema=1). pt-query-digest’i düzenli çalıştırarak trendleri takip edin. Uygulama katmanında prepared statements kullanın. Sunucu kaynaklarını izleyin (top, vmstat). Bu yaklaşımla, yavaş sorguları kökünden çözün ve performansı kalıcı kılın.

Slow Query Log’u sistematik kullanmak, veritabanı performansınızı dönüştürür. Düzenli analiz ve optimizasyonla, sorgu sürelerini dramatik düşürerek ölçeklenebilirlik kazanın. Bu süreci otomatize ederek, ekip kaynaklarını verimli yönetin ve kullanıcı memnuniyetini artırın. Uygulamanızı hemen inceleyin ve farkı gözlemleyin.

Yazar: Lorem
çerik: 610 kelime
Okuma Süresi: 5 dakika
Zaman: Bugün
Yayım: 24-02-2026
Güncelleme: 24-02-2026