Yazılım & Kodlama

Veritabanı İndeksleme: Doğru Kullanımı ve Sık Düşülen Tuzaklar

İndeksler, veritabanı performansının en güçlü aracıdır; ama yanlış kullanıldığında yararından çok zarar verir. İndekslerin nasıl çalıştığını, bileşik indeksleri ve klasik tuzakları anlaşılır biçimde açıklıyoruz.

Veritabanı İndeksleme: Doğru Kullanımı ve Sık Düşülen Tuzaklar

İndeks, veritabanının en güçlü silahıdır; ama aynı zamanda en çok yanlış anlaşılan konularından biridir. Kimileri "her sütuna indeks koyalım, hızlansın" derken, kimileri indekslerden ürkerek hiç kullanmaz. Gerçek ikisinin ortasındadır: indeks, doğru yerde kullanıldığında bir sorguyu binlerce kat hızlandırır; gereğinden fazla veya yanlış yerde kullanıldığında ise yazma işlemlerini yavaşlatır ve disk şişirir. Bu yazıda indekslerin nasıl çalıştığını, ne zaman fayda getirdiğini ve hangi tuzaklara düşülmemesi gerektiğini anlaşılır bir dille anlatıyoruz.

Veritabanı İndeksleme: Doğru Kullanımı ve Sık Düşülen Tuzaklar
Veritabanı tasarımı

İndeks Aslında Nedir?

İndeksi bir kitabın arkasındaki dizin gibi düşünebilirsiniz. Bir konuyu 500 sayfa arasında aramak yerine, dizine bakar ve doğrudan ilgili sayfaya gidersiniz. Veritabanı indeksi de tam olarak bunu yapar: belirli bir sütunun değerlerini sıralı bir yapıda (çoğu zaman bir B-ağacı, yani B-tree) tutar ve aranan değere hızla ulaşmayı sağlar.

İndeks olmadan, veritabanı bir değeri bulmak için tüm tabloyu satır satır taramak zorundadır (full table scan). Bir milyon satırlık tabloda bu, her sorguda bir milyon satırın okunması demektir. İndeksle ise veritabanı yalnızca birkaç adımda hedefe ulaşır.

İndeks, veriye hız katmaz; veriye ulaşma yolunu kısaltır. Fark buradadır: doğru yolu göstermeyen bir indeks hiçbir işe yaramaz.

Hangi Sütunlara İndeks Konur?

İndeks eklenmesi en mantıklı yerler bellidir:

  • WHERE koşullarında sık kullanılan sütunlar: Filtreleme yaptığınız sütunlar birinci adaydır.
  • JOIN'de kullanılan yabancı anahtarlar: Tabloları birleştirdiğiniz sütunlarda indeks neredeyse zorunludur.
  • ORDER BY ve GROUP BY sütunları: Sıralama ve gruplama, uygun indeksle ek maliyet olmadan yapılabilir.
  • Benzersizlik gereken alanlar: E-posta gibi tekil olması gereken alanlarda UNIQUE indeks hem hız hem bütünlük sağlar.

Bileşik İndeksler ve Sütun Sırası

Birden fazla sütunu kapsayan bileşik indekslerde (composite index) sütunların sırası kritiktir. İndeksi bir telefon rehberi gibi düşünün: soyada göre, sonra ada göre sıralıdır. Yalnızca soyadı biliyorsanız hızlı bulursunuz; yalnızca adı biliyorsanız rehber işe yaramaz. Aynı mantık indekslerde de geçerlidir.

-- (kategori_id, fiyat) üzerinde bileşik indeks
CREATE INDEX idx_kat_fiyat ON urunler (kategori_id, fiyat);

-- Bu sorgu indeksi kullanır:
WHERE kategori_id = 5 AND fiyat < 100

-- Bu sorgu indeksi TAM kullanamaz (soldaki sütun yok):
WHERE fiyat < 100

Kural şudur: bileşik indeks, en soldaki sütundan başlayarak "önek" olarak kullanılabilir. Bu yüzden en seçici ve en sık filtrelenen sütunu genellikle başa koymak mantıklıdır.

Kapsayan İndeks (Covering Index)

Bir sorgunun ihtiyaç duyduğu tüm sütunlar indekste bulunuyorsa, veritabanı asıl tabloya hiç dokunmadan cevabı doğrudan indeksten üretir. Buna kapsayan indeks denir ve okuma ağırlıklı sistemlerde muazzam bir hız kazancı sağlar.

Veritabanı İndeksleme: Doğru Kullanımı ve Sık Düşülen Tuzaklar
DevOps ve otomasyon

İndekslerin Bedeli: Ücretsiz Değildir

İndeksler bedava gelmez. Her indeks, tabloya yapılan her INSERT, UPDATE ve DELETE işleminde güncellenmek zorundadır. Yani indeks eklemek okumayı hızlandırırken yazmayı yavaşlatır. Ayrıca her indeks disk alanı tüketir.

  1. Yazma ağırlıklı tablolarda gereksiz indekslerden kaçının.
  2. Hiç kullanılmayan indeksleri düzenli olarak tespit edip kaldırın.
  3. "Ne olur ne olmaz" diyerek her sütuna indeks eklemeyin; bu klasik bir israftır.

Sık Düşülen Tuzaklar

Fonksiyon Sarmalı Sütunlar

WHERE içinde sütunu bir fonksiyona sararsanız indeks kullanılamaz. WHERE LOWER(email) = 'x' yerine veriyi zaten küçük harf saklayıp doğrudan karşılaştırmak gerekir.

Düşük Seçicilikli Sütunlar

Yalnızca iki değer alan bir "aktif mi" sütununa tek başına indeks koymak çoğu zaman anlamsızdır; çünkü veritabanı zaten satırların yarısını okumak zorunda kalacaktır. Seçicilik (cardinality) ne kadar yüksekse indeks o kadar değerlidir.

Sol Tarafta Joker Karakter

LIKE '%kelime' gibi baştan joker içeren aramalar indeksten faydalanamaz. Metin araması ihtiyacı yüksekse, tam metin indeksi (full-text index) veya özel arama motorları düşünülmelidir.

İyi indeksleme bir denge sanatıdır: okuma hızını kazanırken yazma maliyetini ve disk şişkinliğini gözden kaçırmamak gerekir.

Nasıl Doğru İndekslersiniz?

Pratik bir yol haritası şöyledir: önce gerçek sorgularınızı toplayın, en sık ve en yavaş olanları belirleyin, bunların WHERE ve JOIN koşullarını inceleyin, EXPLAIN ile hangi indeksin kullanıldığını doğrulayın ve yalnızca ölçülebilir fayda getiren indeksleri ekleyin. İndeksleme, "önce ekleyip sonra bakarız" değil, "önce ölçüp sonra ekleriz" işidir.

Sonuç

İndeks, veritabanı performansının en büyük kaldıracıdır; ama ancak bilinçli kullanıldığında. Doğru sütunlarda, doğru sırayla ve gerçek sorgu ihtiyacına göre kurulan indeksler, bir uygulamanın hızını dönüştürür. Öte yandan gereğinden fazla veya yanlış yerde indeks, sessizce yazma performansınızı yer. Berasoft olarak özel yazılım projelerinde indeks stratejisini gerçek sorgu davranışına göre kurar, düzenli olarak gözden geçiririz. Sisteminizin veritabanı katmanını sağlamlaştırmak isterseniz projenizi konuşalım.

Bu yazıyı paylaş:

Bir sonraki projeniz için hazır mısınız?

Okuduklarınızı işinize uygulamak veya dijital dönüşümünüzü konuşmak isterseniz, ekibimiz bir mesaj uzağınızda.

Görüşler

0 Yorum

İlk yorumu siz yazın.

Yorum Yap

Yorumlar moderatör onayından sonra yayınlanır.