Yazılar · 17.04.26 · 1 dk

PostgreSQL index seçimi: bench önce, varsayım sonra

B-tree varsayılan değil. GIN, BRIN, partial — hangi sorgu hangi index?

PostgreSQL index seçimi: bench önce, varsayım sonra

PostgreSQL'de index (dizin), veritabanının kitap indeksi gibi aramayı hızlandırır — ama her yazma işlemini de yavaşlatır. EXPLAIN ANALYZE (sorgunun nasıl çalıştığını gösteren komut) olmadan index eklemek borç almaktır; bir sonraki sprintte yazma yükünü hissedersin.

Sık gördüğüm hatalar: her yabancı anahtara (FK) aynı index, her JSON alanına GIN index, kısmi index'i "gereksiz" sanmak. Oysa çoğu liste sorgusu zaten WHERE status = 'active' ile filtreli; kısmi index tam burada işe yarar.

Index türleri karşılaştırması Karar akışı basit tutulabilir: eşitlik filtresi → B-tree, metin arama veya JSON içinde arama → GIN, zaman serisi ve log tabloları → BRIN. Yavaş bir e-ticaret sipariş listesi sorgusu düşün:

SELECT * FROM orders WHERE tenant_id = $1 AND status = 'open' ORDER BY created_at DESC LIMIT 20;

(tenant_id, status, created_at DESC) birleşik kısmi index — sadece WHERE status = 'open' satırları için — genel FK index'inden çoğu zaman daha iyi performans verir.

Testi gerçek veri hacminde, soğuk önbellek ve eşzamanlı yazma ile yapmak önemli. PostgreSQL'in sorgu planlayıcısı konuşur; sunum slaytları değil.

Özet: Index eklemeden önce EXPLAIN ANALYZE çalıştır. Sorgunun filtresine uygun index türünü seç.

PostgreSQL index seçimi: bench önce, varsayım sonra — Aziz Osmanoğlu