SQL Performans Optimizasyonu: Index, EXPLAIN ve En İyi Uygulamalar
Veri Tabanı Yönetimi ve Optimizasyonu
SQL Performans Optimizasyonu: Index, EXPLAIN ve En İyi Uygulamalar

SQL Performans Optimizasyonu: İndeks, EXPLAIN ve En İyi Uygulamalar
Veritabanı sorgularının performansı, uygulama ölçeklenebilirliği ve kullanıcı deneyimi açısından kritiktir. Bu makalede indeks temel ilkeleri, EXPLAIN ile sorgu planı analizi, sık yapılan hatalar ve uygulanabilir adımlar bir arada sunulacaktır. Örnekler genel SQL uygulamaları ve yaygın motorlar (PostgreSQL, MySQL, SQL Server) göz önünde bulundurularak hazırlanmıştır; komutların davranışı kullandığınız motora göre değişebilir.
İndeks Nedir ve Neden Önemlidir?
İndeks, bir veya birden fazla sütun üzerinde oluşturulan veri yapısıdır ve arama, filtreleme ve join işlemlerinde tablo taramasını (full table scan) azaltarak okuma performansını iyileştirir. Bununla birlikte her indeks yazma işlemleri (INSERT/UPDATE/DELETE) için ek maliyet getirir ve depolama gereksinimini artırır. Bu dengeyi kurmak: hangi sorguların kritik olduğu, veri yükü ve güncelleme sıklığına bakılarak yapılmalıdır.
Daha fazla teknik açıklama ve örnek kullanım için bkz. SQL Ekibi ve Poyraz Hosting.
İndeks Türlerine Kısa Bakış
- B-tree: Çoğu veritabanında varsayılan; aralık sorguları ve sıralama için uygundur.
- Hash: Eşitlik karşılaştırmaları için faydalı olabilir; tüm motorlarda aynı davranış ve destek yoktur.
- Clustered / Non-clustered: Bazı sistemlerde fiziksel sıra clustered index ile belirlenir; bu kavram motorlara göre farklılık gösterir.
İndeks türleri ve hashing üzerine teknik açıklamalar için örnek bir kaynak: Fatih Soysal.
İyi Bir İndeks Tasarımının Kuralları
- İhtiyaç odaklı indeks oluşturun: WHERE, JOIN, ORDER BY ve GROUP BY içinde sık kullanılan sütunlar en iyi adaylardır.
- SELECT * yerine sadece gerekli sütunları seçin: Kaplayıcı (covering) indekslerin faydası sorguda kullanılan sütunlara bağlıdır.
- Bileşik indekslerde sıralama önemlidir: Birçok optimizatör sol baştan eşleşmeyi kullanır (left-most rule).
- Low-selectivity (düşük seçicilik) sütunlar: Boolean gibi çok az farklı değer içeren sütunlar genelde indeks için uygun değildir.
- İndeks maliyetini ölçün: Her indeks yazma maliyetini artırır; gereksiz indeksler silinmelidir.
Poyraz Hosting makalesinde indekslerin yazma maliyetine dair pratik uyarılar bulunmaktadır: SQL’de Index Kullanımı ve Performans İyileştirmeleri.
EXPLAIN: Sorgu Planını Anlamak
EXPLAIN komutu, sorgunun nasıl yürütüleceğine dair planı gösterir; bazı veritabanları EXPLAIN ANALYZE gibi modlarla sorguyu çalıştırıp gerçek yürütme istatistiklerini de sağlar. Planı yorumlarken dikkat edilmesi gerekenler:
- Seq Scan / Table Scan: Tüm tablo taraması; genellikle istenmeyen ve optimizasyon gerektiren bir durumdur.
- Index Scan / Index Seek: İndeks kullanıldığını gösterir; Index Seek genelde daha hedefli erişimi işaret eder.
- Tahmini vs Gerçek Satır Sayıları: Büyük farklar varsa istatistik güncellemesi gerekebilir.
- Maliyetli adımlar: Planın en maliyetli düğümleri darboğazı gösterir; buradan hareketle çözüm oluşturulur.
EXPLAIN analizine dair örnek ve rehberlik için bkz. Fatih Soysal.
Pratik Optimizasyon İş Akışı
- Performans sorunlarını tespit edin: Slow query log, uygulama izleme (APM) veya veritabanı metrikleri ile yavaş sorguları belirleyin.
- Planı alın: EXPLAIN veya EXPLAIN ANALYZE çalıştırarak yürütme planını kaydedin.
- Darboğazı tespit edin: Seq Scan, yüksek maliyetli join veya hatalı tahmin edilen satır sayıları gibi işaretlere bakın.
- Çözüm üretin: İndeks ekleme, sorgu yeniden yazımı, fonksiyon kullanımını azaltma veya veri modelinde düzenleme gibi seçenekleri değerlendirin.
- Test edin ve karşılaştırın: Değişiklikleri test ortamında ölçün; okuma kazanımlarının yazma maliyetiyle dengelendiğinden emin olun.
- İzleyin ve bakım yapın: İstatistikleri güncelleyin, indeks bakımlarını planlayın ve performansı sürekli izleyin.
Pratik İpuçları ve Örnek Durumlar
- Fonksiyon kullanan WHERE koşulları: WHERE LOWER(email) = 'x' gibi kullanım indeksin kullanılmasını engeller; mümkünse normalize edilmiş sütun veya ifade indeksleri (motor destekliyorsa) tercih edin.
- Join performansı: Join yapılan sütunlar üzerinde uygun indeks varsa sorgular önemli ölçüde hızlanır.
- Kaplayıcı indeks (covering index): Sorguda ihtiyaç duyulan tüm sütunları içeren bir indeks, ekstra tablo erişimini ortadan kaldırarak hızlı sonuç verebilir.
İndeks Bakımı ve İzleme
İndeksler zamanla parçalanabilir veya verinin dağılımı değiştikçe eskimeye başlayabilir. Birçok veritabanı motoru için periyodik bakım (ör. reindex, vacuum veya rebuild) ve istatistik güncelleme (ANALYZE/UPDATE STATISTICS) önemlidir. Ayrıca slow query log, motorun sağladığı performans view'ları ve APM araçları ile düzenli izleme uygulayın.
Kontrol Listesi (Hızlı Denetim)
- Yavaş sorgular belirlendi ve önceliklendirildi mi?
- EXPLAIN ile plan alındı mı ve Seq Scan vb. tespit edildi mi?
- WHERE/JOIN sütunları için uygun indeks var mı?
- İndeks sayısı yazma maliyetini artırıyor mu?
- İstatistikler güncel ve bakım planı mevcut mu?
Özet: Doğru indeks seçimi ve EXPLAIN ile yapılan plan analizi, veritabanı performansını artırmanın temel yollarıdır. Değişiklikleri test ortamında ölçün, yazma maliyetlerini göz önünde bulundurun ve motor dökümantasyonuna başvurarak uygulayın.
Kaynaklar
- Sorgu Performansını Artırmak için: Index Kullanımı — SQL Ekibi
- SQL’de Index Kullanımı ve Performans İyileştirmeleri — Poyraz Hosting
- Performans İçin SQL Sorgu Optimizasyonu — Semih Bebek
- SQL Performansı: İndeksleme, Hashing ve Sorgu Optimizasyonu — Fatih Soysal
Uyarı: Bu makale genel bilgilendirme amaçlıdır. Üretim veritabanınızda değişiklik yapmadan önce mutlaka test ortamında doğrulama yapın, yedek alın ve kullandığınız veritabanı motorunun resmi dokümantasyonuna başvurun.