Veritabanı İndeksi (SQL Index) Nedir, Nasıl Çalışır?
Veritabanı indeksi nedir, B-tree gibi yapılarla sorguları nasıl hızlandırır, ne zaman faydalı ve ne zaman zararlıdır, sorgu planı ile birlikte örnekle.
İndeks nedir?
Veritabanı indeksi, bir tablodaki satırları belirli sütunlar üzerinden hızlı bulmayı sağlayan ek bir veri yapısıdır. Kitabın arkasındaki dizine benzer: bir terimi bulmak için tüm kitabı baştan sona taramak yerine dizinde terime bakar ve doğrudan ilgili sayfaya gidersiniz.
İndeks olmadan veritabanı, aradığınız satırı bulmak için çoğu zaman tablonun tamamını okur; buna tam tarama denir. Tablo büyüdükçe bu işlem yavaşlar. İndeks ise aranan değere doğrudan ulaşıp gereksiz okumayı önler.
Nasıl çalışır?
İndeks, seçilen sütunun değerlerini sıralı biçimde ve her değerin gösterdiği satır konumuyla birlikte tutar. En yaygın yapı B-tree (dengeli ağaç) yapısıdır. Ağaç, arama alanını her adımda daraltarak aranan değere az sayıda adımda ulaşır; eşitlik aramalarında ve aralık sorgularında, örneğin belirli tarihler arasında, iyi sonuç verir.
Başka yapılar da vardır, örneğin yalnızca eşitlik aramasına odaklanan karma (hash) indeksler ya da metin aramasına özgü indeksler. Hangi türlerin desteklendiği veritabanı ürününe göre değişir.
Başlıca indeks türleri
- Tek sütunlu indeks: Bir sütun üzerinde kurulur; en basit biçimdir.
- Bileşik indeks: Birden fazla sütunu birlikte kapsar. Sütun sırası önemlidir, çünkü indeks soldaki sütundan başlayarak kullanılır.
- Benzersiz indeks: Aynı değerin tekrarını engeller; birincil anahtar ve benzersizlik kısıtları çoğu zaman bununla desteklenir.
- Kısmi (filtreli) indeks: Yalnızca belirli koşulu sağlayan satırları indeksler, örneğin yalnızca aktif kayıtlar.
- Kapsayan indeks: Sorgunun ihtiyaç duyduğu sütunları içerir, böylece tabloya hiç gitmeden yanıt verilebilir.
Örnek: sipariş sorgusunu hızlandırmak
Örneğin bir siparişler tablosunda çok sayıda kayıt var ve uygulama sürekli belirli bir müşterinin son siparişlerini listeliyor. Sorguda müşteri numarasına göre filtre ve tarihe göre sıralama yapılıyor. İndeks yoksa veritabanı her seferinde tüm tabloyu okur.
Müşteri numarası ve sipariş tarihi sütunları üzerinde bileşik bir indeks oluşturulduğunda, veritabanı doğrudan o müşterinin kayıtlarına gider ve zaten sıralı bulduğu için ayrıca sıralama yapmaz. İndeksin gerçekten kullanılıp kullanılmadığı sorgu planına bakılarak doğrulanır.
İndeksin bedeli: ne zaman zarar verir?
İndeks bedavaya gelmez. Her ekleme, güncelleme ve silme işleminde ilgili indekslerin de güncellenmesi gerekir; yani indeks sayısı arttıkça yazma işlemleri yavaşlar. İndeksler ayrıca depolama alanı tüketir.
Bu yüzden her sütuna indeks atmak yanlıştır. Az sayıda farklı değeri olan sütunlarda, küçük tablolarda ya da çok nadir kullanılan sorgularda indeks fayda sağlamaz. Hiç kullanılmayan indeks ise yalnızca maliyet getirir; bu nedenle düzenli olarak gözden geçirilip temizlenir.
Sorgu planı ile birlikte kullanım
Sorgu planı, veritabanının bir sorguyu nasıl çalıştıracağını gösteren yol haritasıdır. Planda tam tarama mı yoksa indeks taraması mı yapıldığı, tahmini maliyetin nerede toplandığı ve birleştirme yönteminin ne olduğu görülür.
İndeks tasarımı bu plana bakarak yapılır: yavaş sorguyu bulun, planını okuyun, uygun indeksi ekleyin ve planın değiştiğini doğrulayın. Tahmin yerine ölçüm esastır. Sorgu yazım biçimi de önemlidir; sütun üzerinde fonksiyon uygulamak indeksin kullanılmasını engelleyebilir.
Bu konuyu Mindset programlarında nerede çalışırsınız?
Mindset kataloğundaki Veritabanı İndeksleme ve Sorgu Planı Analizi eğitiminin modülleri arasında İndeks Yapıları ve Türleri, Sorgu Planı Okuma, İndeks Tasarım Stratejileri ile Bakım, Temizlik ve Değerlendirme bulunur.
İlgili Mindset programı
Veritabanı İndeksleme ve Sorgu Planı Analizi
Sık sorulan sorular
İndeks her sorguyu hızlandırır mı?
Hayır. İndeks yalnızca sorgunun filtre, sıralama ya da birleştirme için kullandığı sütunlarda fayda sağlar. Küçük tablolarda veya tablonun büyük bölümünü döndüren sorgularda tam tarama zaten daha uygun olabilir; bu yüzden indeks ihtiyaca göre eklenir.
İndeks neden yazma işlemlerini yavaşlatır?
Her kayıt eklendiğinde, değiştiğinde ya da silindiğinde, o tabloya bağlı tüm indekslerin de güncellenmesi gerekir. Bu ek iş yazma süresini uzatır, bu yüzden yazma yoğun tablolarda gereksiz indekslerden kaçınılır.
Bileşik indekste sütun sırası neden önemlidir?
İndeks soldaki sütundan başlayarak kullanılır. Örneğin müşteri ve tarih sırasıyla kurulmuş bir indeks, yalnızca müşteriye göre aramada işe yarar, yalnızca tarihe göre aramada çoğu zaman yarar sağlamaz; bu nedenle sütun sırası sorgu kalıplarına göre seçilir.
İndeksin kullanılıp kullanılmadığı nasıl anlaşılır?
Sorgu planına bakılır. Planda indeks taraması görünüyorsa kullanılıyordur; tam tarama görünüyorsa kullanılmıyordur. Yazım biçimi, veri dağılımı ve istatistiklerin güncelliği bu kararı etkileyebilir; plan beklenenden farklıysa bu etkenler sırayla kontrol edilir.