MongoDB — Indexes
Selamlar, MongoDB üzerindeki index çeşitlerini, her birinin bildiğim kadarıyla özelliklerini ve tavsiye edilen kullanım çeşitlerini paylaşmaya çalıştım. Keyifli okumalar dilerim.
MongoDB üzerindeki index çeşitlerini aşağıda sıralayalım.
- Single field Index
- Compound Index
- Hashed Index
- Multikey Index
- TTL Index
- Unique Index
- Sparse Index
- Partial Index
Single Field Indexes
Tek bir field için oluşturulan indexlere adından da anlaşılacağı gibi Single Field Index denir. Mongoda default olarak _id alanı Single Field Index’e sahiptir. İstersek başka alanlara da bu indexden ekleyebiliriz. Indexlerimize sort order parametresi de verebiliyoruz.
Örnek index oluşturma komutunu aşağıda paylaşıyorum.
db.events.createIndex( { userId: 1 } )
Compound Indexes
Compound indexler birden fazla fieldın aynı index üzerinde yazılmasını sağlayan, Single Field Index’in genelleştirilmiş halidir.
Not: Compound indexler maximum 31 adet fielda sahip olabilir.
Single Field Indexlerdeki gibi sort order da create edilirken belirtilir.
db.events.createIndex({"userId": 1, "updateDate": 1})
Hashed Key Indexes
Hash tabanlı sharding yapılmasını sağlamak amacıyla hashed key kullanılır. 3 nodelu bir Mongo cluster kurduğumuzu düşünelim. Bir dokümanı getirmek için sorgu gönderdiğimizde mongo dökümanın hangi nodeda olduğunu bulabilmek için bu hashkeyleri kullanacaktır.
Detaylı bilgiye buradan ulaşabilirsiniz.
https://docs.mongodb.com/manual/core/index-hashed/
Multikey Indexes
Array tipindeki bir field üzerinden indexleme yapmak istediğimizde kullandığımız index tipi multikeydir. Array tipindeki bir fielda index atamak istediğimizde MongoDB array içerisindeki bütün valuelar için bir index key oluşturur. Multikey indexler hem scalar valueları (String, integer etc.) hem de nested documentleri de kapsar. Ekstra bir işlem yapılmasına gerek yoktur.
Not: Her bir multikey indexde valuesu array olan yalnız bir field verilebilir. 2 array fieldına da aynı anda index atamak istediğimizde hata ile karşılaşırız.
Not: Aşağıdaki dökümanları içeren collection için compound multikey index tanımlaması hem a hem de b fieldları için yapılabilir.
{ _id: 1, a: [1, 2], b: 1, category: “A array” }
{ _id: 2, a: 1, b: [1, 2], category: “B array” }// Index creation
db.events.createIndex({"a": 1, "b": 1})// Fail
db.events.insert({"a": [1, 2, 3], "b": [1, 2]})
Ancak görüldüğü üzere a ve b fieldlarının ikisi de array tipinde olduğunda index kuralına uymadığı için insertion işlemi fail olacaktır.
TTL Index (Time to live index)
Bu index tipi bir date fielda bağlı olarak tanımlanır. Belirtilen date fielda göre bir expire date belirlenir ve expire olduğunda MongoDB otomatik olarak dökümanı collectiondan siler. MongoDB background işlemleri içerisinde olan bu olay her 60 saniyede bir tetiklenir ve expire olmuş dökümanları ayıklar.
db.user.createIndex({"udt": 1}, {expireAfterSeconds: 3600})
Yukarıdaki şekilde tanımlama yapılabilir.
Not: Eğer belirtilen date tipindeki field bir array ise MongoDB en düşük değeri kullanacaktır.
Not: Eğer belirtilen fieldın değeri bir date ya da date tipinde array değilse döküman expire olmayacaktır.
Not: Eğer döküman udt fieldına sahip değilse expire olmayacaktır.
Unique Indexes
Bu index tipi index tanımlanan fielddaki değerlerin çift olmayacağını garanti eder. Yani tekrar eden kayıtları kabul etmez. Unique index tanımlanacak field değerleri eşit olan 2 kayıt varsa index tanımlaması hata verir.
Unique index tanımlaması şu şekilde yapılır;
db.user.createIndex({“userId” : 1}, {unique : true})
Sparse Indexes
Sparse indexler sadece varolan fieldlar için indexleme işlemi yapar. Normal indexler eğerki seçilen index fieldı yoksa index mapinde null olarak yer kaplar. Sparse index null değerleri de saklamayıp daha yüksek performansda çalışır.
db.user.createIndex( { "name": 1 }, { sparse: true } )
Partial Indexes
Partial indexler sadece verilen şartı sağlayan dökümanları indexler. Verilen şart ne kadar spesifikse o kadar az döküman indexlenir ve hem daha performanslı hem de daha az storage kullanarak çalışır.
db.user.createIndex(
{ userId: 1, name: 1 },
{ partialFilterExpression: { age: { $gt: 18 } } }
)
partialFilterExpressionda kullanılabilecek conditionlar aşağıda listelenmiştir.
- equality expressions
$exists: true
expression,$gt
,$gte
,$lt
,$lte
expressions,$type
expressions,$and
operator (Sadece en üst operatörse)
Not: Partial indexler MongoDB 3.2 ile birlikte gelmiştir. Sparse index yerine partial index kullanılması MongoDB tarafından önerilmektedir.
Sort Order
Index referansları artan (ascending / 1) ya da azalan (descending / -1) şekilde saklanabilir. Single Field Indexler için bu değerin bir önemi yoktur çünkü MongoDB her iki türe de çevrilebiliyor. Ancak Compound Indexlerde kullanılan querye göre indexin kullanılıp kullanılamayacağı belirlenir.
Not: Sort Order belirtilmeyen indexlerde resultlar memorydeki sıraya göre listelenir. Sıralama işlemi yapılmak istendiğinde collectiondaki document sayısına da bağlı olmak üzere daha düşük performansda çalışacaktır ve eğer query memoryden 32mb kullanırsa işlem otomatik olarak iptal edilir.
Örnek vermek gerekirse, events isminde bir collectionımız olsun. İçerisinde userId ve updateDate fieldları olduğunu düşünelim. UserIdler için artan, updateDateler için azalan sırada olacak şekilde bir index oluşturalım.
db.events.createIndex( { “userId” : 1, “updateDate” : -1 } )
Sort orderı ilk açıklamaya başladığım kısımdaki gibi MongoDB sıralama tipini tam terse çevirebiliyor. Bu sebeple yukarıda paylaştığım index, aşağıda paylaşacağım 2 queryi de destekliyor.
db.events.find().sort( { userId: 1, updateDate: -1 } )db.events.find().sort( { userId: -1, updateDate: 1 } )
Ancak, aşağıda paylaştığım query, oluşturduğumuz index tarafından desteklenmez.
db.events.find().sort( { userId: 1, updateDate: 1 } )
SON
Umarım biraz olsun yararlı olmuştur, geri dönüşlerinize ve güncellemelere göre yazıyı update etmeyi planlıyorum.
Mutlu kodlamalar,
Murat