format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightSlow Query Nedir ve Neden Önemlidir?
- arrow_rightSlow Query Tespit Yöntemleri
- arrow_right1. MySQL Slow Query Log
- arrow_right2. EXPLAIN Komutu
- arrow_right3. Performance Schema ve sys Schema
- arrow_rightSlow Query Analiz Araçları
- arrow_rightpt-query-digest Kullanımı
- arrow_rightSlow Query Çözüm Stratejileri
- arrow_right1. İndeks Optimizasyonu
- arrow_right2. Sorgu Yeniden Yazma
- arrow_right3. Veritabanı Yapısı Optimizasyonu
- arrow_right4. Query Cache Ayarları
- arrow_rightSlow Query İzleme ve Önleme
- arrow_right1. Continuous Monitoring
- arrow_right2. Development Sürecinde Önlem
- arrow_rightSlow Query Threshold Değerleri
- arrow_rightSonuç ve Öneriler
Slow Query Nedir ve Neden Önemlidir?
Slow query (yavaş sorgu), veritabanı sunucusunda normalden daha uzun sürede çalışan SQL sorgularını ifade eder. MySQL ve MariaDB gibi popüler veritabanı sistemlerinde, varsayılan olarak 10 saniyeden uzun süren sorgular "slow query" olarak sınıflandırılır. Bu sorgular, sunucu performansını ciddi şekilde olumsuz etkileyerek uygulama yanıt sürelerinin artmasına ve kullanıcı deneyiminin bozulmasına neden olur.
Araştırmalara göre, web uygulamalarının %80'den fazlası yavaş sorgulardan kaynaklanan performans sorunları yaşar. Veritabanı optimizasyonu yapılmamış sistemlerde, sorgu yanıt süreleri 10 katına kadar çıkabilmektedir.
Slow Query Tespit Yöntemleri
1. MySQL Slow Query Log
MySQL'in yerleşik slow query log özelliği, yavaş sorguların kaydedilmesi için en yaygın kullanılan yöntemdir. Bu özelliği etkinleştirmek için my.cnf veya my.ini dosyasında aşağıdaki ayarları yapmanız gerekir:
slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow-query.log long_query_time = 2
long_query_time parametresi, sorgunun kaç saniyeden sonra "yavaş" sayılacağını belirler. Production ortamlarında genellikle 2 saniye önerilir.
2. EXPLAIN Komutu
Sorgularınızın nasıl çalıştığını analiz etmek için EXPLAIN komutunu kullanabilirsiniz. Bu komut, sorgunun hangi indeksleri kullandığını, kaç satır tarandığını ve tahmini maliyetini gösterir.
EXPLAIN SELECT * FROM users WHERE email = '[email protected]';
3. Performance Schema ve sys Schema
MySQL 5.6 ve sonraki sürümlerde, Performance Schema ve sys schema araçları daha detaylı analiz imkanı sunar. Özellikle sys.schema_statements_summary_by_digest view'i, tekrarlayan sorguların analizinde çok etkilidir.
Slow Query Analiz Araçları
Birçok araç, slow query'lerin tespiti ve analizinde kullanılır:
- mysqldumpslow: MySQL ile birlikte gelen, slow query log dosyalarını analiz eden komut satırı aracı
- pt-query-digest: Percona Toolkit'in bir parçası olan, daha gelişmiş analiz özellikleri sunan araç
- MySQL Enterprise Monitor: Grafik arayüzü ile real-time izleme imkanı
- phpMyAdmin: Web tabanlı arayüzden EXPLAIN ve profil oluşturma özellikleri
pt-query-digest Kullanımı
pt-query-digest /var/log/mysql/slow-query.log
Bu komut, log dosyasındaki sorguları analiz ederek en sık çalıştırılan ve en fazla zaman alan sorguları listeler.
Slow Query Çözüm Stratejileri
1. İndeks Optimizasyonu
Yavaş sorguların en yaygın nedeni eksik veya yanlış indekslerdir. İndeks oluştururken dikkat edilmesi gereken noktalar:
- WHERE clause'da sık kullanılan kolonlara indeks ekleyin
- JOIN işlemlerinde kullanılan kolonları indeksleyin
- Composite indeksler oluştururken en ayrımcı kolonu önce kullanın
- Kullanılmayan indeksleri kaldırın (disk alanı ve yazma performansı için)
CREATE INDEX idx_user_email ON users(email); CREATE INDEX idx_order_user_date ON orders(user_id, created_at);
2. Sorgu Yeniden Yazma
Bazı durumlarda sorguların yapısını değiştirmek performansı önemli ölçüde artırır:
- SELECT * yerine sadece gerekli kolonları seçin
- IN yerine EXISTS veya JOIN kullanmayı deneyin
- Alt sorguları JOIN'lere dönüştürün
- Gereksiz ORDER BY ve GROUP BY kullanımından kaçının
3. Veritabanı Yapısı Optimizasyonu
Veritabanı tasarımı, sorgu performansını doğrudan etkiler. Normalizasyon kurallarına uyun ancak aşırı normalizasyondan kaçının. Okuma yoğun uygulamalarda denormalizasyon düşünülebilir. Büyük tablolar için partitionlama kullanmak sorgu performansını artırabilir.
4. Query Cache Ayarları
MySQL 5.6 ve önceki sürümlerde query cache kullanılabilir. Ancak MySQL 8.0'da kaldırılmıştır. Bunun yerine uygulama seviyesinde cache çözümleri (Redis, Memcached) kullanmanızı öneriyoruz. Redis ve Memcached karşılaştırması hakkında daha fazla bilgi edinebilirsiniz.
Slow Query İzleme ve Önleme
1. Continuous Monitoring
Slow query sorunlarını önlemenin en etkili yolu sürekli izlemektir. Aşağıdaki yöntleri uygulayabilirsiniz:
- Auto-explain veya query profiler kullanarak sorguları otomatik analiz edin
- Alerting sistemleri kurun (sorgu süresi eşik değerini aştığında uyarı)
- Performans metriklerini Grafana veya benzeri araçlarla görselleştirin
2. Development Sürecinde Önlem
Code review süreçlerinde sorgu performansını değerlendirin. Query plan analizi yapmadan production'a kod deploy etmeyin.
Slow Query Threshold Değerleri
Farklı uygulama türleri için önerilen threshold değerleri:
| Uygulama Türü | Önerilen Threshold | Not |
|---|---|---|
| E-ticaret | 1 saniye | Kullanıcı deneyimi kritik |
| Blog/CMS | 2 saniye | Ortalama acceptable |
| Analitik/Dashboard | 5 saniye | Büyük veri setleri |
| API Servisleri | 500ms | Mikro-hizmet mimarisi |
Sonuç ve Öneriler
Slow query sorunlarının çözümü sistematik bir yaklaşım gerektirir. İlk adım olarak slow query log'u etkinleştirip sorunlu sorguları tespit edin. EXPLAIN komutu ile sorgu planlarını analiz edin ve indeks eksikliklerini giderin. Sorgu optimizasyonunun yanı sıra, sunucu log analizi yaparak genel sistem sağlığını da takip etmenizi öneriyoruz.
Düzenli izleme ve proaktif optimizasyon, veritabanı performansını uzun vadede sağlıklı tutmanın anahtarıdır. Özellikle yüksek trafikli uygulamalarda, dedicated sunucu kullanarak kaynak tüketimini optimize edebilir ve slow query sorunlarını minimize edebilirsiniz.