Veritabanı indeksleri sorgu motorunun veriye erişim yolunu kisaltir. Doğru indeks full table scan'i index seek'e indirir; yanlış indeks her yazmada maliyet oluşturur. Indeks stratejisi uygulama ekibinin sorgu pattern'lerini bilmesini gerektirir. Bu yazida B-tree, composite index, covering index, partial index ve production indeks yönetimini inceliyoruz.
Indeks nasil çalışır
B-tree logaritmik arama sağlar. Clustered index tablo fiziksel sirasini belirler. Yüksek kardinaliteli kolonlar düşük kardinaliteliden daha degerlidir. Partial index düşük kardinalite + filtre kombinasyonunda etkilidir.
Composite index ve kolon sırası
Birlesik indeks sol-prefix kuralina tabidir. Equality kolonlari once, range kolonlari sonra gelmelidir. ORDER BY yonu indeksle uyumlu olmalidir.
CREATE INDEX ix_orders_customer_status_created
ON orders (customer_id, status, created_at DESC);
Covering index
CREATE INDEX ix_orders_customer_covering
ON orders (customer_id)
INCLUDE (status, total_amount, created_at);
Index-only scan key lookup maliyetini ortadan kaldirir. Leaf genislemesi denge gerektirir.
Partial index
CREATE INDEX ix_users_active_email
ON users (email)
WHERE deleted_at IS NULL;
Soft delete tablolarda partial index neredeyse zorunludur.
FK indeksleme
FK kolonu indekslenmezse parent islemleri child'da full scan tetikler. Her FK icin indeks varsayilan kural olmalidir.
Özel indeks turleri
- GIN/GiST: JSONB, full-text, array
- BRIN: büyük sirali zaman serisi
- Columnstore: analitik agregasyon
Plan analizi
EXPLAIN (ANALYZE, BUFFERS)
SELECT id, total_amount FROM orders
WHERE customer_id = 42 AND status = 'paid'
ORDER BY created_at DESC LIMIT 20;
Seq Scan ve yüksek cost sinyalleri verir. Missing index onerileri körü uygulanmamali.
Yazma maliyeti
Her indeks INSERT/UPDATE/DELETE'te güncellenir. Kullanılmayan indeksler istatistiklerle tespit edilir. Zero scan indeksler kaldirma adayidir.
Bakım
Fragmentasyon ve bloat performansi dusurur. REINDEX ve VACUUM planli yapilir. Fill factor update agir tablolarda page split azaltir.
Online indeks oluşturma
CREATE INDEX CONCURRENTLY ve ONLINE = ON production icin tercih edilir. Migration idempotent olmali.
Anti-pattern'ler
- Her kolona indeks
- Leading wildcard LIKE
- Güncel olmayan istatistikler
- OR kosullarinda tek indeks yetersizligi
Karar cercevesi
Sorgu sikligi, latency SLA, yazma etkisi ve indeks boyutu olculmeden indeks eklenmemeli.
Partitioning ve indeks etkilesimi
Tablo partition (range, hash, list) kullanıldığında her partition ayri fiziksel yapı tasir. Global indeks (PostgreSQL 11+ partitioned table index) veya partition-aligned index tasarımı sorgu planini etkiler. Zaman serisi verisinde aylik partition + BRIN veya local B-tree kombinasyonu yaygindir. Partition pruning calismiyorsa indeks faydasi sinirli kalir; WHERE koşulu partition key icermelidir.
Full-text ve özel indeksler
LIKE '%kelime%' B-tree kullanamaz. PostgreSQL tsvector + GIN, SQL Server full-text catalog alternatiftir. JSONB alan icinde arama icin GIN jsonb_path_ops veya expression index ( (data->>'sku') ) dusunulur. Cografi veri icin PostGIS GiST indeksleri mesafe sorgularini hizlandirir.
Indeks izleme ve SLO
Production'da p95 sorgu suresi, buffer cache hit ratio ve index scan vs seq scan orani izlenir. Regresyon tespiti icin haftalik slow query raporu cikarilir. Indeks degisikligi change management gerektirir: staging'de ölçüm, production'da düşük trafik penceresi, rollback plani. Indeks silmek de risklidir; once unused dogrulamasi yapilir.
Read replica ve indeks farklilastirma
Primary OLTP indeksleri minimal tutulurken read replica'da rapor sorgulari icin ek covering index eklenebilir. Replication lag rapor indekslerinin gecikmesini tolere etmelidir. Materialized view refresh zamanlamasi indeks bakım penceresiyle cakismamalidir.