Hızlı Özet (TL;DR)
Veritabanı performans sorunlarının %90’ı eksik veya yanlış indekslemeden kaynaklanır. Tablolar yüz binlerce satıra ulaştığında her SELECT sorgusunun tüm tabloyu baştan sona taraması (Sequential / Table Scan) CPU ve disk I/O darboğazı yaratır. Çözüm; sık filtrelenen sütunlara uygun B-Tree veya Composite indeksler tanımlamak, EXPLAIN ANALYZE ile sorgu planını incelemek ve gereksiz indeks sayısını sınırlayarak INSERT/UPDATE maliyetini dengelemektir.
İndeks Türleri ve Kullanım Senaryoları
İlişkisel veritabanlarında (RDBMS) doğru veri tipi için doğru indeks yapısını seçmek hayati önem taşır:
| İndeks Türü | Çalışma Mantığı | En İyi Kullanım Alanı | Dikkat Edilmesi Gerekenler |
|---|---|---|---|
| B-Tree İndeks | Dengeli ağaç yapısı ile logaritmik arama | Eşitlik (=) ve aralık (BETWEEN, <, >) sorguları | Varsayılan indekstir; sütundaki veri dağılımı önemlidir |
| Composite (Bileşik) İndeks | Birden fazla sütunun sıralı birleşimi | WHERE departman_id = 5 AND aktif = true gibi çoklu filtreler | Sol kuralı (Leftmost prefix rule) geçerlidir |
| Partial (Kısmi) İndeks | Yalnızca belirli bir koşulu sağlayan satırlar | WHERE durum = 'beklemede' (Genel tablonun küçük bir kısmı) | İndeks boyutunu küçültür ve belleği korur |
| GIN / Full-Text İndeks | Tersine indeks (Inverted Index) | JSONB veri tipleri ve uzun metin içi kelime aramaları | Yazma maliyeti B-Tree’ye göre daha yüksektir |
Yavaş Sorgu Teşhisi: EXPLAIN ANALYZE Nasıl Yorumlanır?
Bir sorgunun neden yavaş çalıştığını anlamanın tek bilimsel yolu sorgu planını (Execution Plan) okumaktır:
EXPLAIN ANALYZE
SELECT id, cari_kodu, unvan, bakiye
FROM cariler
WHERE sehir = 'Kocaeli' AND bakiye > 50000;
Bu analiz çıktısında dikkat edilmesi gereken iki kritik kırmızı bayrak vardır:
- Seq Scan (Sequential Scan): Veritabanı aradığınız satırı bulmak için tüm diski okumaktadır. İlgili sütunlara indeks eklenmelidir.
- Rows Removed by Filter: İndeks kullanılmış olsa bile sonradan yüz binlerce satır eleniyorsa, bileşik (composite) indeks eksikliği var demektir.
Sorgu Optimizasyonunda Yapılan 3 Büyük Hata
1. İndekslenmiş Sütunda Fonksiyon Kullanmak
Aşağıdaki sorguda tarih sütununda indeks olsa bile fonksiyon çağrısı yüzünden indeks devre dışı kalır:
-- YANLIŞ: İndeksi öldürür
SELECT * FROM siparisler WHERE YEAR(siparis_tarihi) = 2026;
-- DOĞRU: İndeks aralık taraması (Index Range Scan) yapar
SELECT * FROM siparisler
WHERE siparis_tarihi >= '2026-01-01' AND siparis_tarihi < '2027-01-01';
2. Aşırı İndeks Tanımlamak
Her indeks SELECT sorgusunu hızlandırırken, her INSERT, UPDATE ve DELETE işleminde veritabanı tüm indeks ağaçlarını yeniden düzenlemek zorundadır. Kullanılmayan atıl indeksler periyodik olarak tespit edilip silinmelidir.
Yüksek veri hacmine sahip kurumsal ve endüstriyel veritabanı mimarilerinde performans danışmanlığı için Özel ERP & CRM ve İmalat Çözümleri ekibimizle iletişime geçebilirsiniz.