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çinslow_query_logaktif 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ındakiactual timeverowsdeğ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;AveyaA, Bfiltrelerinde çalışır. YalnızcaBveyaCiçeren sorgularda tetiklenmez. - Covering Index: Sık çağrılan alanları
INCLUDEile 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'yerineWHERE 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.
JOINveya 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.