Veritabanı İndeksleme Nedir?
Veritabanı indeksleme, sorgu performansını dramatik şekilde artıran veri yapılarıdır. Bir kitabın dizin (index) bölümünün belirli bir konuyu bulmayı kolaylaştırması gibi, veritabanı indeksleri de tablolardaki verilere hızlı erişim sağlar. İndeks olmadan veritabanı motoru, bir sorguyu yanıtlamak için tablodaki tüm satırları taramak zorunda kalır (full table scan). Bu, büyük tablolarda kabul edilemez derecede yavaş performansa yol açar.
Milyonlarca satırlık bir tabloda indeks kullanmadan bir kayıt aramak, binlerce sayfalık bir kitapta dizin olmadan bir konu aramak gibidir. İndeksleme, bu arama süresini saniyelerden milisaniyelere düşürebilir. Bu rehberde, veritabanı indekslemenin tüm yönlerini derinlemesine inceleyeceğiz.
İndekslemenin Temelleri
İndeks Nasıl Çalışır?
Bir veritabanı indeksi, ayrı bir veri yapısı olarak saklanır ve orijinal tablodaki belirli sütunlara işaretçiler (pointer) içerir. Sorgu motoru bir WHERE, JOIN veya ORDER BY koşulunu değerlendirirken, önce indekse bakarak ilgili satırların fiziksel konumunu belirler ve doğrudan o konumlara erişir.
İndekslemenin Maliyeti
İndeksler bedava değildir. Dikkat edilmesi gereken trade-off'lar:
- Disk alanı: Her indeks ek disk alanı tüketir.
- Yazma performansı: INSERT, UPDATE ve DELETE işlemleri indeksleri de güncellemelidir.
- Bakım maliyeti: Indekslerin düzenli olarak yeniden oluşturulması veya optimize edilmesi gerekebilir.
- Bellek kullanımı: Sık kullanılan indeksler bellekte (buffer pool) tutulur.
Doğru yerde doğru indeks, sorgu süresini 1000 kat azaltabilir. Yanlış yerde yanlış indeks ise yazma performansını ciddi şekilde düşürür. İndeksleme bir sanattır; veri erişim kalıplarınızı analiz edin ve buna göre strateji belirleyin.
1. B-Tree İndeks
B-Tree Nedir?
B-Tree (Balanced Tree), veritabanı sistemlerinin varsayılan ve en yaygın kullanılan indeks yapısıdır. PostgreSQL, MySQL (InnoDB), SQL Server ve Oracle dahil neredeyse tüm ilişkisel veritabanları B-Tree indeks kullanır.
B-Tree Yapısı
B-Tree, dengeli bir ağaç yapısıdır ve şu bileşenlerden oluşur:
- Kök düğüm (Root node): Ağacın en üst noktası. Arama burada başlar.
- Dallanma düğümleri (Branch nodes): Ara düğümler. Arama yönünü belirleyen anahtar değerleri içerir.
- Yaprak düğümleri (Leaf nodes): En alt seviye. Gerçek veri işaretçilerini içerir.
B-Tree Performans Özellikleri
| İşlem | Zaman Karmaşıklığı | Açıklama |
|---|---|---|
| Arama | O(log n) | Ağaç derinliğiyle orantılı |
| Ekleme | O(log n) | Yaprak düğümüne ekleme + dengeleme |
| Silme | O(log n) | Yaprak düğümünden silme + dengeleme |
| Aralık sorgusu | O(log n + k) | k: sonuç kümesi boyutu |
B-Tree Ne Zaman Kullanılır?
- Eşitlik sorguları (WHERE id = 5)
- Aralık sorguları (WHERE age BETWEEN 20 AND 30)
- Sıralama (ORDER BY created_at)
- Prefix araması (WHERE name LIKE 'Ali%')
- MIN, MAX fonksiyonları
2. Hash İndeks
Hash İndeks Nedir?
Hash indeks, bir hash fonksiyonu kullanarak anahtar değerleri doğrudan depolama konumlarına eşler. B-Tree'den farklı olarak yalnızca eşitlik sorgularında çalışır; aralık sorguları, sıralama veya prefix araması desteklenmez.
Hash vs B-Tree Karşılaştırması
| Özellik | Hash İndeks | B-Tree İndeks |
|---|---|---|
| Eşitlik sorgusu | O(1) - Çok hızlı | O(log n) - Hızlı |
| Aralık sorgusu | Desteklenmiyor | Destekleniyor |
| Sıralama | Desteklenmiyor | Destekleniyor |
| Disk kullanımı | Daha az | Daha fazla |
| Çakışma yönetimi | Gerekli | Gerekli değil |
Hash İndeks Kullanım Alanları
- Tam eşitlik aramaları (WHERE email = '[email protected]')
- Session ID aramaları
- Cache anahtarı aramaları
- Benzersiz tanımlayıcı (UUID) sorguları
3. Composite (Bileşik) İndeks
Composite İndeks Nedir?
Composite indeks, birden fazla sütunu birleştiren bir indeks türüdür. Birden fazla sütuna göre filtreleme veya sıralama yapan sorgularda dramatik performans artışı sağlar.
Sütun Sıralamasının Önemi
Composite indekste sütun sıralaması kritik öneme sahiptir. "Leftmost prefix" kuralına göre, indeks yalnızca soldan sağa sütun sırasına uygun sorgularda kullanılır:
- Bir indeks (A, B, C) şeklinde tanımlandığında:
- WHERE A = x sorgusu indeksi kullanır
- WHERE A = x AND B = y sorgusu indeksi kullanır
- WHERE A = x AND B = y AND C = z sorgusu indeksi tam kullanır
- WHERE B = y sorgusu indeksi KULLANMAZ (A atlandığı için)
Composite İndeks Stratejileri
- Yüksek seçicilikten düşüğe: En çok filtreleme yapan sütunu başa koyun
- Eşitlik önce, aralık sonra: Eşitlik koşullarını aralık koşullarından önce yerleştirin
- Covering index: Sorgunun ihtiyaç duyduğu tüm sütunları indekse dahil ederek tablo erişimini ortadan kaldırın
4. Sorgu Optimizasyonu
EXPLAIN Komutu
EXPLAIN komutu, veritabanı motorunun bir sorguyu nasıl çalıştırmayı planladığını gösterir. İndeks kullanımını doğrulamak ve performans darboğazlarını tespit etmek için vazgeçilmez bir araçtır.
EXPLAIN Çıktısını Okumak
EXPLAIN çıktısındaki temel metrikler:
- Seq Scan: Tam tablo taraması — indeks kullanılmıyor, genellikle kötü işaret
- Index Scan: İndeks kullanılarak veri erişimi — istenen durum
- Index Only Scan: Yalnızca indeks okunuyor, tabloya erişilmiyor — en iyi durum
- Bitmap Index Scan: Birden fazla indeksin birleştirilmesi
- Rows: Tahmini işlenecek satır sayısı
- Cost: Sorgunun tahmini maliyeti
Yaygın Sorgu Optimizasyon Teknikleri
- SELECT * kullanmaktan kaçının: Yalnızca ihtiyacınız olan sütunları seçin.
- WHERE koşullarını optimize edin: İndekslenmiş sütunlarda fonksiyon kullanmayın.
- JOIN sırasını optimize edin: Küçük tablodan büyük tabloya doğru JOIN yapın.
- Subquery yerine JOIN: Çoğu durumda JOIN, subquery'den daha performanslıdır.
- LIMIT kullanın: Büyük sonuç kümeleri için her zaman LIMIT ekleyin.
- Prepared statements: Tekrarlanan sorgular için sorgu planını önbelleğe alın.
5. Özel İndeks Türleri
GIN (Generalized Inverted Index)
JSON, diziler ve tam metin arama için optimize edilmiş indeks türüdür. PostgreSQL'de JSONB sütunları ve tsvector aramaları için yaygın kullanılır.
GiST (Generalized Search Tree)
Geometrik veriler, coğrafi sorgular ve aralık tipleri için kullanılır. PostGIS ile coğrafi veritabanı sorgularında kritik öneme sahiptir.
BRIN (Block Range Index)
Fiziksel olarak sıralı veriler için çok verimli, düşük disk kullanımlı indeks türüdür. Zaman serisi verileri ve log tabloları için idealdir.
İndeksleme En İyi Uygulamaları
- Sık sorgulanan sütunları indeksleyin, tümünü değil
- Düşük kardinaliteli (az farklı değer) sütunlarda B-Tree indeks verimsizdir
- Kullanılmayan indeksleri kaldırın (pg_stat_user_indexes ile kontrol edin)
- İndeks boyutunu düzenli olarak izleyin
- Partial indeksler ile yalnızca belirli koşullara uyan satırları indeksleyin
Sonuç
Veritabanı indeksleme, uygulama performansının en kritik belirleyicilerinden biridir. B-Tree ile genel amaçlı sorgularda mükemmel performans, hash indeksle eşitlik aramalarında anlık sonuçlar, composite indeksle çoklu koşullu sorguları hızlandırma ve EXPLAIN ile sorgu planlarını analiz etme yeteneği kazanırsınız. Doğru indeksleme stratejisi, veritabanınızın milisaniyeler içinde yanıt vermesini sağlar; yanlış strateji ise sisteminizi yavaşlatan görünmez bir düşmandır.