Furkan KapukayaYazılım geliştirme
Backend, API ve Veritabanı3 dk okuma

Veritabanı İndeksi Nedir? Yavaş Sorguları Hızlandırmanın Temeli

Veritabanı indekslerinin çalışma mantığı, clustered ve nonclustered indeks, bileşik indeks ve sütun sırası, kapsayan indeks, indekslerin yazma maliyeti ve hangi sütunlara indeks eklenmesi gerektiği.

Bir kitapta belirli bir konuyu aramak için iki yol vardır: her sayfayı baştan sona okumak veya arkadaki dizine bakmak. Veritabanı indeksi, tam olarak bu dizindir. Doğru indeks, saniyeler süren bir sorguyu milisaniyelere indirebilir; yanlış veya eksik indeks ise büyüyen her tabloyla birlikte uygulamayı yavaşlatır.

İndeks olmadan ne olur?

WHERE Telefon = '5551234567' sorgusu için indeks yoksa veritabanı tablodaki her satırı tek tek kontrol eder (tablo taraması). Bin kayıtta fark edilmez; bir milyon kayıtta kullanıcılar beklemeye başlar.

İndeks türleri

Clustered (kümelenmiş) indeks

Tablonun kendisinin hangi sırayla saklandığını belirler; bu yüzden bir tabloda yalnızca bir tane olur. SQL Server'da genellikle birincil anahtar üzerindedir.

Nonclustered (kümelenmemiş) indeks

Ayrı bir yapıda, seçilen sütunların sıralı bir kopyasını ve satıra giden işaretçiyi tutar. Bir tabloda birden fazla olabilir.

Bileşik indeks ve sütun sırası

CREATE INDEX IX_Siparis_Musteri_Tarih ON Siparisler (MusteriId, Tarih);

Bu indeks şu sorgularda kullanılır:

  • WHERE MusteriId = 5
  • WHERE MusteriId = 5 AND Tarih >= '2026-01-01'

Ama yalnızca WHERE Tarih >= '2026-01-01' sorgusunda verimli kullanılamaz. Telefon rehberi gibi düşünün: soyada göre sıralı bir rehberde yalnızca ada göre arama yapamazsınız. Kural: eşitlik koşulları önce, aralık koşulları sonra.

Kapsayan (covering) indeks

Sorgunun ihtiyaç duyduğu tüm sütunlar indeksin içindeyse veritabanı tabloya hiç gitmez:

CREATE INDEX IX_Siparis_Musteri ON Siparisler (MusteriId) INCLUDE (Tarih, Tutar);

İndeksin bedeli

İndeksler ücretsiz değildir:

  • Her ekleme, güncelleme ve silmede indeksler de güncellenir; yazma işlemleri yavaşlar.
  • Disk ve bellek alanı kaplar.
  • Kullanılmayan indeksler yalnızca yük getirir.

Bu yüzden "her sütuna indeks" yaklaşımı yanlıştır.

Hangi sütunlara indeks?

  1. WHERE koşullarında sık kullanılan sütunlar
  2. JOIN için kullanılan yabancı anahtarlar (birçok veritabanı bunları otomatik indekslemez!)
  3. ORDER BY ile sık sıralanan sütunlar
  4. Benzersiz olması gereken alanlar (benzersiz indeks, aynı zamanda veri bütünlüğü sağlar)

İndeksi bozan sorgu alışkanlıkları

  • Sütuna fonksiyon uygulamak: WHERE YEAR(Tarih) = 2026 yerine WHERE Tarih >= '2026-01-01' AND Tarih < '2027-01-01'
  • Baştan joker: LIKE '%ahmet' indeks kullanamaz; LIKE 'ahmet%' kullanabilir.
  • Tip uyuşmazlığı: sayısal sütunu metinle karşılaştırmak dönüşüme yol açar.

Nasıl ölçülür?

Sorgunun yürütme planı (execution plan), indeks kullanılıp kullanılmadığını gösterir. SQL Server ve PostgreSQL ayrıca eksik indeks önerileri ve en pahalı sorguların listesini sunar. Ayrıntılar: SQL Server performansı. Tablo tasarımının temeli için bkz. normalizasyon.

Sık sorulan sorular

İndeks eklemek canlı sistemi etkiler mi?

Büyük tablolarda indeks oluşturmak kaynak tüketir ve kilitlenmeye yol açabilir. Yoğun olmayan saatlerde veya çevrim içi indeks oluşturma seçenekleriyle yapılmalıdır.

ORM kullanıyorum, indeks yine de gerekli mi?

Kesinlikle. EF Core gibi araçlar sorguyu üretir ama indeksi tasarlamak sizin işinizdir.

Sonuç

İndeks, veritabanı performansının en etkili ve en ucuz aracıdır. Sorgu alışkanlıklarını tanıyıp doğru sütunları doğru sırayla indekslemek, uygulamanın büyürken hızlı kalmasını sağlar.