Index Nedir?

Veritabanında bir değer arattığımız zaman, ilgili değerleri bulabilmek için kayıtların tamamına sırayla tek tek bakılır (table scan). Collection’ımızda (tablomuzda) birkaç yüz document(kayıt) var ise, tüm kayıtların tek tek bakılması çok fazla zaman kaybı yaratmayacaktır. Fakat collection’ımızdaki (tablomuzdaki) document (kayıt) sayısı milyon seviyelerindeyse, aranan değer için tüm document’lara bakılması,  sonucun gelmesini çok fazla geciktirecektir. Sorgularda tablonun baştan sona tamamının taranmasını engellemek için RDBMS’lerde de kullandığımız Index’ler oluştururuz.

Table Scan ile Index Arasındaki Performans Farkı

Table scan ile index arasındaki performans farkını görmek “explain()” fonksiyonunu kullanacağız. Explain fonksiyonu RDBMS’den bildiğimiz “explain query”‘ye denk gelmektedir. Öncelikle 100000 kayıtlık test verisi oluşturuyoruz.


db.kullanicilar.drop();
for (i = 0; i < 100000; i++) {
db.kullanicilar.insert({
"no" : "no_"+i,
"kullaniciadi" : "ayni isim",
"yas" : Math.floor(Math.random() * 100),
"olusturmaTarihi" : new Date()
});
}

Index olmadan herhangi bir değeri arattığımız zaman oluşacak olan maliyeti execute() ile öğreniyoruz.

db.kullanicilar.find({no: "no_1"}).explain();

MongoDB - explain() Index Olmadan Veriye Erişim

MongoDB – explain() Index Olmadan Veriye Erişim

“n” değeri, sorgu sonucu bulunan sonuç adedini gösterir.

“nscanned” değeri, collection içindeki taranan obje adedini gösteriyor. 100000 kayıt olduğu için 100000 adet kaydı kontrol etmiş.

“milis” değeri, sorgunun sonuçları getirmek için harcadığı süreyi milisaniye cinsinden gösterir.

Not: index olmayan aramalarda yapılan sorgularda, sonuç ilk kayıtlarda bulunsa bile, başka kayıtların da olup olmadığına bakıldığı için tüm colleciton sorgulanır. Eğer ilgili kayıttan 1 tane varsa veya 1 kayıt geri dönmesi yeterli ise, kalan collection’ın taranmasını limit() fonksiyonu ile engelleyebiliriz.  Örnek kullanım şu şekildedir.

db.kullanicilar.find({no: "no_100"}).limit(1).explain();

MongoDB Index'siz Tablolarda Limit Fonksiyonunun Performansa Etkisi

MongoDB Index’siz Tablolarda Limit Fonksiyonunun Performansa Etkisi

Ekran çıktısında görüldüğü üzere, ilgili değerden bir adet bulunduğu zaman, arama sonlandırılıyor. Böylece 100’üncü kayda, ilk 100 kaydı kontrol ederek ulaşılabilir. (Ekran çıktısındaki collection’ın “i” değeri 0 dan başladığı için sorgu 101 adet tarama yaptı.)

Eğer aradığımız kayıt sonda olsaydı, neredeyse tüm collection’nın taranması gerekecekti. Bu sebeple limit fonksiyonunun yetersiz kaldığı durumları da kapsayan index yapısına geçilmesi gerekir.

Index Oluşturma

ensureIndex komutu ile index şu şekilde oluşturulur:

db.kullanicilar.ensureIndex({"no" : 1});

MongoDB Index Oluşturma

MongoDB Index Oluşturma

“numIndexesBefore” değeri, collection’da daha önceden oluşturulmuş index adedini göstermektedir. Komut çalıştırılmadan önce bulunan index, otomatik oluşturulmuş “_id” anahtarının index’idir.

“numIndexesAfter” değeri, komut çalıştırıldıktan sonra bulunan index adedini vermektedir.

“ok”: değeri, işlemin başarılı olup olmadığını gösterir. “1” ise başarılı, “0” ile başarısızdır.

Index oluşturulduktan sonra, tekrar no_100 kaydını explain plan’nını incelersek, index’in performans üzerindeki farkını görebiliriz.

db.kullanicilar.find({no: "no_100"}).explain();

MongoDB Index'li Tablolarda Veriye Erişim

MongoDB Index’li Tablolarda Veriye Erişim

Ekran çıktısında görüldüğü üzere, index olan kayıtta arama yapıldığı zaman, aranan veri tüm tablo taranmadan, doğrudan erişilebiliyor.

Index Kullanmanın Dez Avantajları

Index’ler ekstra yer kaplayan objelerdir. Bu sebeple filtreleme yapmayacağımız anahtar-değer’ler için index oluşturmak, disk üzerinde gereksiz yer kaplayacaktır. Filtreleme yapılacak yerler için işgal edilen disk alanı ise, kazanılan performans artışının yanında önemsiz kalmaktadır.

Collection’a değer eklendikçe indexler yenilenecektir (update). Bu sebeple index olan collection’lar üzerindesilme (delete), güncelleme (update), ekleme (insert) işlemleri normalden daha yavaş çalışmaktadır. Ekleme (insert), güncelleme (update), silme (delete) işlemlerinin bir miktar yavaşlıyor olması, kazanılan performans artışının yanında önemsiz kalmaktadır.