
Veritabanı İndeksleme: Sorguları Hızlandırmanın Temelleri
Tablo büyüdükçe sorgu süresi doğrusal biçimde artar, çünkü veritabanı eşleşen satırı bulmak için tabloyu baştan sona tarar. İndeks bu taramayı ortadan kaldırır ve aramayı ağaç yapısı üzerinde birkaç adıma indirir.
Ancak indeks bedava değildir. Her indeks diskte yer kaplar ve her ekleme, güncelleme ve silme işleminde ayrıca güncellenir. Bu yüzden soru şu olmalıdır: hangi sorgular sık çalışıyor ve bu sorgular hangi kolonlara bakıyor?
İndeks nasıl çalışır?
Yaygın veritabanlarında indeksler B ağacı yapısında tutulur. Değerler sıralı biçimde saklandığı için aranan kayda ikili aramaya benzer şekilde ulaşılır. Milyonlarca satırlık bir tabloda bile eşleşme birkaç adımda bulunur.
Bu yapı eşitlik aramalarında olduğu kadar aralık sorgularında da işe yarar. Tarih aralığı, büyüktür küçüktür karşılaştırmaları ve sıralama işlemleri indeksten yararlanır.
Hangi kolonlar indekslenir?
- WHERE koşulunda sık kullanılan kolonlar.
- Tablolar arası birleştirmede kullanılan yabancı anahtar kolonları.
- ORDER BY ve GROUP BY ifadelerinde geçen kolonlar.
- Benzersizliği yüksek kolonlar; birkaç farklı değer alan kolonda indeksin faydası sınırlıdır.
Cinsiyet ya da durum gibi az sayıda farklı değer içeren kolonlarda tek başına indeks genellikle işe yaramaz. Veritabanı, satırların büyük kısmının eşleşeceğini gördüğünde indeksi kullanmak yerine tam tarama yapmayı tercih eder.
Karar için sorgu kayıtlarına bakmak gerekir. Yavaş sorgu günlüğü açıldığında, belirlenen eşiği aşan sorgular dosyaya yazılır ve hangi tablonun hangi koşulla sorgulandığı görünür hale gelir. İndeks kararı tahminle değil bu listeye bakılarak verilir.
Bileşik indeks ve sıra kuralı
Birden fazla kolonu kapsayan indekste kolon sırası belirleyicidir. İndeks yalnızca soldan başlayan sütun kümeleri için kullanılabilir:
CREATE INDEX idx_siparis ON siparisler (kullanici_id, durum, olusturuldu);
-- indeks kullanılır
WHERE kullanici_id = 5
WHERE kullanici_id = 5 AND durum = 'aktif'
-- indeks kullanılmaz
WHERE durum = 'aktif'
WHERE olusturuldu > '2026-01-01'Bu kural, ayrı ayrı üç indeks oluşturmak yerine doğru sırayla tek bir bileşik indeks tanımlamayı çoğu zaman daha verimli kılar. Sıralamayı belirlerken en seçici kolonun başta olması genel bir başlangıç noktasıdır.
İndeksin devre dışı kaldığı durumlar
İndeks tanımlı olsa bile bazı yazım biçimleri veritabanını tam taramaya zorlar. En sık karşılaşılan üç durum şunlardır:
-- kolon üzerinde işlem yapılıyor
WHERE YEAR(olusturuldu) = 2026
-- yerine
WHERE olusturuldu >= '2026-01-01' AND olusturuldu < '2027-01-01'
-- baştan joker karakter
WHERE ad LIKE '%ahmet%'
-- soldan eşleşme indeksten yararlanır
WHERE ad LIKE 'ahmet%'
-- tip uyuşmazlığı: metin kolona sayı gönderiliyor
WHERE telefon = 5551234567Metin içinde arama gerçekten gerekiyorsa tam metin indeksi ya da ayrı bir arama motoru değerlendirilmelidir. Standart indeks bu iş için tasarlanmamıştır.
EXPLAIN çıktısını okumak
Tahmin yerine ölçüm yapmak için sorgu planı incelenir. EXPLAIN, veritabanının hangi indeksi kullandığını ve kaç satır taramayı beklediğini gösterir:
EXPLAIN SELECT * FROM siparisler
WHERE kullanici_id = 5 AND durum = 'aktif';Çıktıda dikkat edilecek iki alan vardır. Erişim tipi tam tarama gösteriyorsa indeks kullanılmıyor demektir. Taranması beklenen satır sayısı, dönen satır sayısına göre çok büyükse indeks yetersiz kalıyordur.
Kapsayıcı indeks
Sorgunun ihtiyaç duyduğu tüm kolonlar indeks içinde yer alıyorsa, veritabanı tabloya hiç gitmeden sonucu indeksten üretir. Bu duruma kapsayıcı indeks denir ve okuma ağırlıklı sorgularda belirgin kazanç sağlar.
-- sorgu yalnızca bu üç kolona bakıyor
SELECT kullanici_id, durum, olusturuldu
FROM siparisler WHERE kullanici_id = 5;
-- indeks üç kolonu da kapsıyor, tabloya erişim gerekmiyor
CREATE INDEX idx_kapsayici ON siparisler (kullanici_id, durum, olusturuldu);Kapsayıcı indeks tasarlarken yıldız işaretiyle tüm kolonları seçmekten kaçınmak gerekir. Sorgu yalnızca gereken kolonları istediğinde indeksin tabloyu kapsaması mümkün olur.
İndeksin maliyeti
Her ek indeks yazma işlemlerini yavaşlatır. Yoğun ekleme yapılan tablolarda gereksiz indeksler toplam performansı düşürür. Kullanılmayan indeksleri tespit edip kaldırmak, yeni indeks eklemek kadar değerlidir.
Aynı kolonla başlayan birden fazla bileşik indeks genellikle gereksiz tekrardır. Kapsamı geniş olan indeks, dar olanın işini de görür.
Kontrol listesi
- İndeks kararı gerçek sorgulara bakılarak verilir.
- Bileşik indekste kolon sırası soldan eşleşme kuralına göre belirlenir.
- WHERE koşulunda kolon üzerinde işlem yapılmaz.
- Karşılaştırmada kolonla aynı tip kullanılır.
- Değişiklik sonrası sorgu planı EXPLAIN ile doğrulanır.
- Kullanılmayan indeksler kaldırılır.
İlgili yazılar
Yorumlar
İlk yorumu sen yap.
İlgili Yazılar

PHP Uygulamasını Üretime Almak: Yapılandırma ve Güvenlik
Geliştirme makinesinde çalışan kod ile üretimde güvenle çalışan kod arasındaki fark yapılandırmadır. Ayarlar, izinler, dağıtım akışı ve son kontroller.

PHP ile REST API Yazmak: Yönlendirme ve HTTP Durum Kodları
Bir API'nin kalitesi çoğunlukla ayrıntılarda belli olur: doğru durum kodu, tutarlı hata biçimi ve öngörülebilir adresler. Saf PHP ile uçtan uca kurulum.

PHPUnit ile Birim Test Yazmak: Kurulum, Sahte Nesneler ve Kapsam
Testin amacı hata bulmak değil, değişikliği güvenle yapabilmektir. Kurulum, ilk test, sahte nesneler ve test edilebilir kodun özellikleri.