TB
← Tüm yazılar

Indeks stratejisi

Doğru indeks stratejisi, sorgu performansini yuzlerce kat iyilestirebilir; yanlış strateji ise yazma performansini ciddi şekilde dusurur.

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

  1. Her kolona indeks
  2. Leading wildcard LIKE
  3. Güncel olmayan istatistikler
  4. 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.