SQL Performansını İyileştirme: İndeksleme ve Sorgu Optimizasyonu Örnekleri
Veri Tabanı Yönetimi ve Optimizasyonu
SQL Performansını İyileştirme: İndeksleme ve Sorgu Optimizasyonu Örnekleri

Giriş
SQL veritabanlarında performans, kullanıcı deneyimi ve altyapı maliyetleri üzerinde doğrudan etkilidir. İyi bir indeksleme stratejisi ve hedefe yönelik sorgu optimizasyonu, sorgu sürelerini ciddi şekilde azaltabilir; ancak yanlış veya gereksiz indeksler yazma (INSERT/UPDATE/DELETE) işlemlerini yavaşlatabilir. Bu makalede temel kavramları, dikkat edilmesi gereken noktaları ve gerçek dünyada uygulanabilecek örnekleri bulacaksınız (Kaynaklar: Ekasunucu — turn0search6; Önder AKÖZ — turn0search9).
İndeksleme: Temel İlkeler
İndeksler, veritabanındaki verilere daha hızlı erişim sağlamak için kullanılan veri yapılarıdır. Sık sorgulanan sütunlara doğru türde indeks eklemek sorgu sürelerini azaltır; fakat her indeksin bir maliyeti vardır: disk alanı kullanımı ve yazma işlemlerinde ek yük (Kaynak: Ekasunucu — turn0search6).
Hangi sütunlara indeks oluşturmalısınız?
- Sorgularda sık kullanılan WHERE, JOIN ve ORDER BY sütunları.
- Kısıtlamalarda (UNIQUE) ve aramalarda yüksek seçiciliğe (selectivity) sahip sütunlar.
- Yazma yoğunluğu düşük ve okuma yoğunluğu yüksek tablolar için daha agresif indeksleme.
Genel kural: indeks eklemeden önce sorgu desenlerini ölçün; yalnızca fayda sağlayan sütunlara indeks oluşturun çünkü gereksiz indeksler yazma işlemlerini yavaşlatabilir (Kaynak: Ekasunucu — turn0search6).
Bileşik (Composite) indeksler
Bileşik indeksler birden fazla sütun üzerinde tanımlanır ve belirli sorgu kombinasyonlarında performansı artırabilir. Eğer sorgularınız aynı sütun grubunu düzenli olarak filtreliyor veya sıralıyorsa bileşik indeks etkili olur. Ancak bileşik indeksin sütun sırası önemlidir; sorgunuzun filtre sırasına uygun tasarlayın (Kaynak: Önder AKÖZ — turn0search9).
İndeks bakımı ve maliyetler
- İndeksler disk alanı kullanır ve yoğun yazma yüklerinde bakım gerektirebilir.
- Periyodik olarak kullanılmayan indeksleri gözden geçirin ve testi yapılmışsa kaldırın.
- Yeniden indeksleme (reindex) veya istatistik güncellemesi gerektiğinde planlı bakım yapın.
Sorgu Optimizasyonu: Temel Kurallar
Sorgu optimizasyonu, gereksiz işlemlerden kaçınmak, sorgu yazımını sadeleştirmek ve veritabanı motorunun indeksleri etkin kullanmasını sağlamaktır. Temel kurallar şunlardır (Kaynak: Ekasunucu — turn0search6):
- SELECT * kullanımından kaçının; yalnızca ihtiyacınız olan sütunları seçin.
- Gereksiz JOIN ve alt sorgulardan kaçının; mümkünse sorguyu basitleştirin veya parçalayarak çalıştırın.
- WHERE koşullarını indeksleri kullanacak şekilde yazın (örn. fonksiyon uygulamayın: WHERE LOWER(col)=... indeks kullanımını engelleyebilir).
- Uygun veri tiplerini seçin; geniş veri tipleri gereksiz I/O'ya yol açabilir.
Sorgu planlarını (execution plan) analiz etme
Execution plan incelemesi, hangi indekslerin kullanıldığını, tarama (scan) veya indeks araması (index seek) olup olmadığını gösterir. EXPLAIN veya benzeri araçlarla sorgu planını çıkartın ve planın hangi adımının en maliyetli olduğunu tespit edin. Plan analizi, optimizasyon sırasında hangi değişikliklerin etkili olacağını belirlemenize yardımcı olur (Kaynak: Ekasunucu — turn0search6).
Pratik Örnekler ve Öneriler
Aşağıda yaygın senaryolar için uygulanabilir örnekler ve SQL ifadeleri yer alır. Bu örnekler geneldir; kendi veritabanınızın sözdizimi ve özelliklerine göre uyarlama yapın.
| Durum | Öneri | Örnek SQL |
|---|---|---|
| Kullanıcı e-posta ile sorgulanıyor | Email sütununa tek sütunlu indeks ekleyin | CREATE INDEX idx_users_email ON users(email); SELECT id, name FROM users WHERE email = '[email protected]'; |
| Bir kullanıcının siparişleri tarih sırasına göre sorgulanıyor | Bileşik indeks: (user_id, created_at) ile ORDER BY/WHERE optimizasyonu | CREATE INDEX idx_orders_user_created ON orders(user_id, created_at); SELECT id, total FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 10; |
| JOIN ile kullanıcı ve sipariş birleştiriliyor | JOIN sütunlarına (users.id, orders.user_id) indeks ekleyin; sadece gerekli sütunları seçin | CREATE INDEX idx_orders_userid ON orders(user_id); SELECT o.id, o.total, u.name FROM orders o JOIN users u ON o.user_id = u.id WHERE u.email = '[email protected]'; |
Nasıl test edilir?
- Önceki sorgu planını EXPLAIN ile alın ve çalışma süresini ölçün.
- İndeks ekledikten sonra aynı sorguyu tekrar çalıştırıp planı ve süreyi karşılaştırın.
- Gerçek veri dağılımını yansıtan ortamlarda (staging veya üretim benzeri) test yapın; küçük test verileri yanıltıcı olabilir.
Kontrol Listeleri (Checklist)
İndeks İnceleme Kontrol Listesi
- Sorgu loglarını analiz ederek sık kullanılan sütunları tespit edin.
- Yazma yoğunluğu yüksek tablolarda her indeksin maliyetini değerlendirin.
- Kullanılmayan indeksleri test ederek kaldırın.
- Bileşik indeks oluştururken sorgu filtre sırasını dikkate alın.
Sorgu Optimizasyon Kontrol Listesi
- SELECT * yerine gerekli sütunları seçin.
- WHERE koşullarında fonksiyon kullanmaktan kaçının veya indeks uyumlu ifadeler kullanın.
- JOIN'leri sadeleştirin; gerektiğinde alt sorgu yerine geçici tablo/CTE kullanarak parçalayın.
- Execution planını düzenli olarak inceleyin ve istatistikleri güncel tutun.
Sık Yapılan Hatalar ve Önlemler
- Fazla sayıda ve test edilmemiş indeks eklemek — yazma işlemlerinde yavaşlama. Önlem: indeksleri ölçümle doğrulayın (Kaynak: Ekasunucu — turn0search6).
- SELECT * kullanmak — gereksiz I/O. Önlem: sadece gereken sütunları seçin.
- Sorgu planını incelememek — optimizasyonun etkisini bilmeden değişiklik yapmak. Önlem: EXPLAIN ile önce/sonra analizleri yapın (Kaynak: Ekasunucu — turn0search6).
Sonuç
İndeksleme ve sorgu optimizasyonu, veritabanı performansını iyileştirmenin iki ana eksenidir. İndeksler doğru kullanıldığında sorgu sürelerini azaltır; ancak gereksiz indeksler yazma işlemlerini yavaşlatabilir. Sorgu yazımını sadeleştirmek, doğru veri tiplerini seçmek ve execution planları düzenli olarak analiz etmek etkili sonuç verir. Bu rehberde verilen kontrol listelerini uygulayarak ve gerçek dünyada test ederek en uygun stratejiyi belirleyebilirsiniz (Kaynaklar: Ekasunucu — turn0search6; Önder AKÖZ — turn0search9).