format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightSlow Query Log Nedir ve Neden Önemlidir?
- arrow_rightSlow Query Log'u Aktif Hale Getirme
- arrow_rightParametre Değerlerini Dinamik Değiştirme
- arrow_rightSlow Query Log Formatı ve Yapısı
- arrow_rightSorgu Analizi İçin Araçlar
- arrow_right1. mysqldumpslow
- arrow_right2. pt-query-digest (Percona Toolkit)
- arrow_right3. MySQL Workbench
- arrow_right慢查询优化技巧
- arrow_right1. EXPLAIN Kullanımı
- arrow_right2. İndeks Stratejileri
- arrow_right3. Sorgu Yeniden Yazma
- arrow_rightPerformans İzleme ve Sürekli Optimizasyon
- arrow_rightQuery Performance Schema
- arrow_rightOptimizasyon Kontrol Listesi
- arrow_rightSonuç
Slow Query Log Nedir ve Neden Önemlidir?
MySQL slow query log, yürütme süresi belirli bir eşiği aşan sorguları kaydeden bir MySQL diagnostic aracıdır. Varsayılan olarak, 10 saniyeden uzun süren sorgular "yavaş sorgu" olarak işaretlenir. Bu log dosyası, özel sunucu altyapılarında veritabanı performansını optimize etmek için kritik öneme sahiptir.
Percona'nın 2023 veritabanı raporuna göre, yavaş sorgular üretim ortamlarında performans düşüşlerinin %67'sinden sorumludur. Bu nedenle slow query log analizi, her MySQL yöneticisinin temel yetkinliklerinden biri olmalıdır.
Slow Query Log'u Aktif Hale Getirme
MySQL yapılandırma dosyasında (my.cnf veya my.ini) aşağıdaki parametreleri ayarlamanız gerekir:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2
log_queries_not_using_indexes = 1
Parametre Açıklamaları:
- slow_query_log: Loglamayı aktif/pasif yapar (1=Açık, 0=Kapalı)
- slow_query_log_file: Log dosyasının yolunu belirtir
- long_query_time: Sorgunun "yavaş" sayılacağı süre eşiği (saniye)
- log_queries_not_using_indexes: İndeks kullanmayan sorguları da logla
Parametre Değerlerini Dinamik Değiştirme
MySQL 5.6 ve sonraki sürümlerde, MySQL yeniden başlatılmadan da bu değerleri değiştirebilirsiniz:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log';
Slow Query Log Formatı ve Yapısı
Modern MySQL sürümlerinde slow query log, aşağıdaki bilgileri içerir:
- Sorgunun başlangıç zamanı ve süresi
- Sorguyu çalıştıran kullanıcı ve host
- Sorgu satırı ve satır numarası
- Tarama yapılan satır sayısı
- İndeks kullanım durumu
Örnek bir log çıktısı:
# Time: 2024-01-15T10:23:45.123456Z
# User@Host: root[root] @ localhost []
# Query_time: 2.345678 Lock_time: 0.000123 Rows_sent: 100 Rows_examined: 50000
SELECT * FROM orders WHERE order_date < '2024-01-01';
Sorgu Analizi İçin Araçlar
1. mysqldumpslow
MySQL ile birlikte gelen yerleşik bir araçtır. Sık tekrarlanan sorguları gruplandırarak analiz eder:
mysqldumpslow -s t /var/log/mysql/slow-query.log
Önemli parametreler:
- -s t: Sorgu süresine göre sırala
- -s c: Sıklığa göre sırala
- -s l: Lock time'a göre sırala
- -t 10: İlk 10 sonucu göster
- -g "pattern": Desene göre filtrele
2. pt-query-digest (Percona Toolkit)
Percona Toolkit'in bu aracı, slow query log'larını detaylı analiz eder ve kapsamlı raporlar sunar:
pt-query-digest /var/log/mysql/slow-query.log
Bu araç, sorguları profil halinde gruplandırarak en kritik performans sorunlarını ön plana çıkarır.
3. MySQL Workbench
Grafiksel arayüzü tercih edenler için MySQL Workbench, slow query log görselleştirme ve analiz imkanı sunar.
慢查询优化技巧
1. EXPLAIN Kullanımı
Sorgu planını analiz etmek için en önemli araç EXPLAIN komutudur:
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;
Önemli çıktı alanları:
- type: MySQL'un tabloya nasıl eriştiğini gösterir (ALL = tam tarama, index = indeks tarama)
- possible_keys: Kullanılabilecek indeksler
- key: Kullanılan gerçek indeks
- rows: Taramanın kaç satır gerektirdiği
- Extra: Ek bilgiler (Using filesort, Using temporary gibi)
2. İndeks Stratejileri
Performans için etkili indeksleme kritik öneme sahiptir:
| İndeks Türü | Kullanım Senaryosu | Örnek |
|---|---|---|
| B-Tree | Eşitlik ve aralık sorguları | WHERE status = 'active' |
| Composite | Çoklu kolon filtreleme | WHERE category_id = 1 AND price > 100 |
| Partial | Büyük TEXT alanları | INDEX idx_desc(Description(100)) |
3. Sorgu Yeniden Yazma
İndeksleme tek başına yeterli değilse, sorgularınızı optimize etmeniz gerekebilir:
- SELECT * yerine gerekli kolonları seçin
- JOIN koşullarını doğru tutun
- Subquery yerine JOIN kullanın
- LIMIT kullanarak sonuç sayısını sınırlayın
- OR yerine IN veya UNION kullanın
Performans İzleme ve Sürekli Optimizasyon
Veritabanı performansını sürekli izlemek için otomatik izleme araçları kullanmanızı öneriyoruz. Ayrıca, sorgu önbellekleri ve Redis/Memcached gibi araçları kullanarak sık tekrarlanan sorguları hızlandırabilirsiniz.
Query Performance Schema
MySQL 5.6 ve üzeri sürümlerde Performance Schema, sorgu performansını gerçek zamanlı izleme imkanı sunar:
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY sum_timer_wait DESC LIMIT 10;
Optimizasyon Kontrol Listesi
- Slow query log'u aktif edin ve uzun_query_time'ı uygun ayarlayın
- Düzenli olarak log dosyalarını analiz edin
- EXPLAIN ile sorgu planlarını inceleyin
- Missing indexes uyarılarına dikkat edin
- Covering index'ler oluşturun
- Sorgu önbellek stratejileri uygulayın
- Periyodik olarak veritabanı bakımı yapın
Sonuç
MySQL slow query log analizi, veritabanı performans optimizasyonunun temel taşıdır. Düzenli analiz ve iyileştirme, uygulama yanıt sürelerini önemli ölçüde azaltır ve kullanıcı deneyimini iyileştirir. unutmayın: en iyi optimizasyon, sorun oluşmadan önce önlem almaktır.