Turkcell | Geleceği Yazanlar

402: MongoDBBaşlangıç seviyesi derslerde Web Programlama uygulama geliştirme ortamını detaylı olarak inceliyoruz.

Tüm Eğitimleri Aldın mı? Kendini sınamanın tam zamanı

Haydi Sınava Gir

Bir Dizin (Index) Oluşturma

Kategori : | Lisans : Creative Commons (by-nc-sa) | En son 12.09.2019 tarihinde güncellendi
Eğitmen : mckare
Etiketler : web-programlama

BİR DİZİN (INDEX) OLUŞTURMA

MongoDB’de, dizin ya da indeks yapıları sayesinde, bir koleksiyon (collection) içindeki belgelere (document) çok daha hızlı olarak erişmek mümkündür. Bu metinde dizin ve indeks sözcükleri eş anlamlı olarak kullanılacaktır. İndeks yapıları nispeten az yer kaplayan ancak etkin veri yapılarıdır. Kullanıcılar herhangi bir koleksiyon için, herhangi bir belge üzerindeki herhangi bir alan (field) için indeksler oluşturabilirler. Default olarak, MongoDB, her koleksiyon için, _id alanı üzerinde bir indeks oluşturur.

TEK BİR ALAN ÜZERİNDE İNDEKS OLUŞTURMA

Bir indeks oluşturmak için, ensureIndex() metodunu ya da sürücünüzdeki (driver) benzer bir metodu kullanmalısınız. Örneğin, aşağıdaki komut ile personel adlı koleksiyonun sicil adlı alanı üzerinde bir indeks oluşturulmaktadır:

db.personel.ensureIndex( { sicil: 1 } )

sicil alanından sonraki sayı dizin ya da indeksin biçimini belirler.

1 değeri kullanılmışsa indeks sicile göre artan (ascending) biçimde oluşturulacaktır; yani sicil değerleri küçükten büyüğe doğru sıralanacaktır.

-1 değeri kullanılırsa da indeks değerleri büyükten küçüğe yani azalan (descending) biçimde sıralanacaktır.

ensureIndex() metodu o anda mevcut olmayan indeks yapılarını ilk kez oluşturmak için kullanılır.

Aşağıdaki sorguda ile, personel kayıtları içinde sicil alanine göre oluşturulan bir indeks kullanılmaktadır:

db.personel.find( { sicil: 2 } ) db.personel.find( { sicil: { $gt: 10 } } )

Oluşturulan indeks aşağıdaki sorgu içinse geçersizdir:

db.personel.find( { pers_url: 2 } )

İndeks kullanmayan sorgular için, Mongkoleksiyon içindeki tüm belgeleri tarayacaktır; bu da doğal olarak önemli zaman kaybı demektir.

UNIQUE (TEK, BENZERSİZ) İNDEKS OLUŞTURMA

MongoDB, indeks oluşturmada unique kısıtını kullanma imkanı da verir. Bunun anlamı şudur: indekslenen alan için birden fazla aynı değerin kullanılmasını engeller. Ayrıca duplicate dropping (kopyaları yok et) olanağı ile birlikte, tekrar eden değerlerin silinmesi de sağlanabilir.

UNIQUE İNDEKS

Unique indeks oluşturmak için aşağıdaki prototip ifadeden yararlanabilirsiniz:

 db.personel.ensureIndex( { a: 1 }, { unique: true } )

Aşağıdaki örnekte vergi numarası ile ilişkili bir unique indeks oluşturulmaktadır; böylece muhasebe koleksiyonunda aynı vergi numarasından birden fazla bulunması engellenecektir:

db.muhasebe.ensureIndex( { "vergi_no": 1 }, { unique: true } )

_id  indeksi de unique bir indekstir. Bazı durumlarda başka bir alan üzerinden unique indeks oluşturmaktansa, bunun yerine _id indeksi ile işlem yapmak daha uygun olabilir.

Bir belde içinde bir alan içinde bir değer yoksa, bu alan için oluşturulan indeks yapısı içinde bu indeks alanı boş (null) olacaktır. Birçok durumda unique kısıtı ile sparse seçeneğini birlikte kullanmak isteyebilirsiniz. Sparse indeksler, herhangi bir indeks alanı boşsa (null) boş indeks alanını saklamak yerine bu alanı atlar; sparse opsiyonu olmadıkça, unique indeksler tekrar eden değerlere müsaade etmez. Bu durumda, MongoDB, indeks alanı olmayan ikinci belgeyi ve onun alt belgelerini reddeder. Aşağıdaki örneğe bakalım:

db.personel.ensureIndex( { a: 1 }, { unique: true, sparse: true } )

unique kısıtını, bileşik indekslerde de (compound indexes) kullanabilirsiniz:

db.personel.ensureIndex( { a: 1, b: 1 }, { unique: true } )

Bileşik indeksin birden fazla alanın bir araya getirilmesiyle oluşturulduğunu hatırlatalım.

Bileşik indeksler için unique kısıtı kullanılırsa, bileşik indeksin tek tek alanlarının tekrarına değil fakat alan gruplarının tekrarına bakılır ve bu tekrarlar önlenir.

Örneğin, bir bileşik indeks a ve b alanlarından meydana gelmişse, a=3, b=7ve a=3, b=9 durumları iki farklı indekstir; buna izin verilir ancak a=3, b=7  ve a=3, b=7 değerleri ise bileşik indeksin tekrarlı olması demektir ve buna müsaade edilmez.

TEKRARLARIN SİLİNMESİ (DROP DUPLICATES)

dropDups komutu yardımı ile indeks oluşturulurken, tekrar eden indeks değerlerine ait belgeler silinir. Aşağıdaki örneğe bakalım:

db.personel.ensureIndex( { a: 1 }, { unique: true, dropDups: true } )

dropDups komutunu kullanırken dikkatli olunmalıdır; bazen veritabanından arzu etmediğiniz kayıt silmeleri de yapabilirsiniz.

BACKGROUND’DA (ARKA PLANDA) İNDEKS OLUŞTURMA

Default olarak, MongoDB, indeksleri ön alanda (foreground) oluşturur. Bu tür indeksler oluşturulurken de veritabanına tüm yazma ve veritabanından okuma işlemleri engellenir.

Halbuki, background indeks oluşturma işlemi, veritabanı ile ilgili okuma-yazma işlemlerini engellemez. Background indeks oluşumu sürerken veritabanından okuma ya da veritabanına yazma işlemleri de gerçekleştirilir.

Background indeks oluşturma işlemi nispeten daha uzun sürer; bu tür indeksler foreground indekslere göre daha büyük yer kaplar ve foreground indekslere göre daha az yoğundur (compact). Zaman içinde background indekslerin biçimi ve performansı da foreground indekslere yaklaşır.

PROSEDÜR

Background’da bir indeks oluşturmak için, ensureIndex() fonksiyonunda background parametresini true yapmak gerekir:

db.personel.ensureIndex( { a: 1 }, { background: true } )