IHS Strategic
Tüm Blog Yazıları
HowTo10 Eylül 2026•2 dk okuma

Veritabanı İndeksleme ve Sorgu Optimizasyonu Rehberi: Yanıt Sürelerini Azaltma

Modern web uygulamalarında yanıt sürelerini düşürmek için adım adım veritabanı indeksleme, EXPLAIN analizi ve sorgu optimizasyon teknikleri.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

1. Adım: Yavaş Sorguları Tespit Etme

Optimizasyon ölçümle başlar. Önce darboğaz yapan SQL sorgularını yakalayın.

  • Slow Query Log: PostgreSQL için log_min_duration_statement, MySQL için slow_query_log aktif edin. Eşik değeri 200ms belirleyin.
  • EXPLAIN ANALYZE: Sorgu çalışma planını ve maliyetini okuyun. Seq Scan (Full Table Scan) görülen yerler ilk hedeftir.
İpucu: EXPLAIN çıktısındaki actual time ve rows değerlerini karşılaştırın. Beklenenden çok satır taranıyorsa indeks eksiktir.

2. Adım: Doğru İndeks Türünü Seçme

Her veri tipi ve arama deseni farklı indeks mimarisi gerektirir.

  • B-Tree: Varsayılan tip. Eşitlik (=) ve aralık (<, >, BETWEEN) sorguları için uygundur.
  • Hash: Sadece tam eşitlik aramalarında B-Tree'den daha az yer kaplar ve hızlıdır.
  • GIN / GiST: JSONB, tam metin araması (Full-Text Search) ve dizi filtrelemeleri için zorunludur.

3. Adım: Bileşik (Composite) İndeks Tasarımı

Birden fazla sütunla filtrelenen tablolarda tekli indeksler yetersiz kalır.

  • En Seçici Sütun En Başa: Kardinalitesi (benzersiz değer sayısı) en yüksek sütunu indeks tanımında ilk sıraya koyun: CREATE INDEX idx_orders_user_status ON orders(user_id, status);
  • Sol Baştan Kuralı: (A, B, C) indeksi; A veya A, B filtrelerinde çalışır. Yalnızca B veya C içeren sorgularda tetiklenmez.
  • Covering Index: Sık çağrılan alanları INCLUDE ile indekse ekleyin. Tablo sayfasına gitmeden (Index Only Scan) veri döner.

4. Adım: Sorgu Antipattern'lerini Temizleme

Yanlış SQL yazımı indeksleri devre dışı bırakır.

  • İndekslenmiş Sütunda Fonksiyon Kullanmayın: WHERE DATE(created_at) = '2024-01-01' yerine WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02' kullanın.
  • Joker Karakter Konumu: LIKE '%metin' indeksi ezer. Prefix araması yapın: LIKE 'metin%'.
  • SELECT * Terk Edin: Yalnızca gereken sütunları çekin. Bellek ve ağ yükünü düşürün.
  • N+1 Problemini Çözün: Döngü içinde sorgu atmayın. JOIN veya ORM seviyesinde Eager Loading (includes, select_related) kullanın.

5. Adım: Modern Web Mimarilerinde Trendler ve Ajans Pratikleri

Modern web projelerinde yüksek trafik yöneten her dijital ajans, veritabanı optimizasyonunu süreç standardı yapar.

  • Read/Write Replikasyonu: Ağır okuma yüklerini Read Replica instance'larına yönlendirin.
  • Connection Pooling: PgBouncer veya yerel havuz yapıları kullanarak bağlantı maliyetlerini sıfırlayın.
  • Önbellek Katmanı: Değişmeyen dinamik sorgu sonuçlarını Redis/Memcached ile bellekten sunun.