MongoDB için Azure Cosmos DB'de dizin oluşturmayı yönetme
ŞUNLAR IÇIN GEÇERLIDIR: MongoDB
MongoDB için Azure Cosmos DB, Azure Cosmos DB'nin temel dizin yönetimi özelliklerinden yararlanır. Bu makalede MongoDB için Azure Cosmos DB kullanarak dizin ekleme konusuna odaklanmaktadır. Dizinler, verilerinizi sorgulamayı kabaca bir büyüklük sırasına göre daha hızlı hale getiren özel veri yapılarıdır.
MongoDB sunucusu sürüm 3.6 ve üzeri için dizin oluşturma
MongoDB için Azure Cosmos DB sunucu sürümü 3.6+ alanı ve parça anahtarını otomatik olarak dizine alır _id
(yalnızca parçalı koleksiyonlarda). API, parça anahtarı başına alanın benzersizliğini _id
otomatik olarak zorlar.
MongoDB API'si, tüm alanları varsayılan olarak dizinleyen NoSQL için Azure Cosmos DB'den farklı davranır.
Dizin oluşturma ilkesi düzenleniyor
Dizin oluşturma ilkenizi Azure portalındaki Veri Gezgini düzenlemenizi öneririz. Veri Gezgini dizin oluşturma ilkesi düzenleyicisinden tek alan ve joker karakter dizinleri ekleyebilirsiniz:
Not
Veri Gezgini dizin oluşturma ilkesi düzenleyicisini kullanarak bileşik dizinler oluşturamazsınız.
Dizin türleri
Tek alan
Tek bir alanda dizinler oluşturabilirsiniz. Tek alan dizininin sıralama düzeni önemli değildir. Aşağıdaki komut alanında name
bir dizin oluşturur:
db.coll.createIndex({name:1})
Azure portalında aynı tek alan dizinini name
oluşturabilirsiniz:
Bir sorgu, kullanılabilir durumda birden çok tek alan dizini kullanır. Koleksiyon başına en fazla 500 tek alan dizini oluşturabilirsiniz.
Bileşik dizinler (MongoDB sunucusu sürüm 3.6+)
MongoDB API'sinde, sorgunuzun aynı anda birden çok alana göre sıralama yapabilmesi gerekiyorsa bileşik dizinler gereklidir . Sıralaması gerekmeyen birden çok filtreye sahip sorgular için, dizin oluşturma maliyetlerinden tasarruf etmek için bileşik dizin yerine birden çok tek alan dizini oluşturun.
Bileşik dizindeki her alan için bileşik dizin veya tek alan dizinleri, sorgularda filtreleme için aynı performansa neden olur.
dizilerle ilgili sınırlamalar nedeniyle iç içe alanlardaki bileşik dizinler varsayılan olarak desteklenmez. İç içe yerleştirilmiş alanınız bir dizi içermiyorsa, dizin amaçlandığı gibi çalışır. İç içe yerleştirilmiş alanınız bir dizi içeriyorsa (yolun herhangi bir yerinde), bu değer dizinde yoksayılır.
Örneğin, yolunun people.dylan.age
üzerinde dizi olmadığından, içeren bileşik dizin bu durumda çalışır:
{
"people": {
"dylan": {
"name": "Dylan",
"age": "25"
},
"reed": {
"name": "Reed",
"age": "30"
}
}
}
Yolda bir dizi olduğundan bu bileşik dizin bu durumda çalışmaz:
{
"people": [
{
"name": "Dylan",
"age": "25"
},
{
"name": "Reed",
"age": "30"
}
]
}
Bu özellik veritabanı hesabınız için 'EnableUniqueCompoundNestedDocs' özelliği etkinleştirilerek etkinleştirilebilir.
Not
Dizilerde bileşik dizinler oluşturamazsınız.
Aşağıdaki komut ve age
alanlarında name
bir bileşik dizin oluşturur:
db.coll.createIndex({name:1,age:1})
Bileşik dizinleri, aşağıdaki örnekte gösterildiği gibi aynı anda birden çok alanda verimli bir şekilde sıralamak için kullanabilirsiniz:
db.coll.find().sort({name:1,age:1})
Tüm alanlarda karşıt sıralama düzenine sahip bir sorguyu verimli bir şekilde sıralamak için önceki bileşik dizini de kullanabilirsiniz. Bir örnek aşağıda verilmiştir:
db.coll.find().sort({name:-1,age:-1})
Ancak bileşik dizindeki yolların dizisi sorguyla tam olarak eşleşmelidir. Ek bileşik dizin gerektiren bir sorgu örneği aşağıda verilmiştir:
db.coll.find().sort({age:1,name:1})
Çok anahtarlı dizinler
Azure Cosmos DB, dizilerde depolanan içeriği dizine almak için çok anahtarlı dizinler oluşturur. Dizi değeri olan bir alanın dizinini oluşturursanız, Azure Cosmos DB dizideki her öğeyi otomatik olarak dizine alır.
Jeo-uzamsal dizinler
Birçok jeo-uzamsal operatör jeo-uzamsal dizinlerden yararlanacaktır. Şu anda MongoDB için Azure Cosmos DB dizinleri desteklemektedir 2dsphere
. API henüz dizinleri desteklemiyor 2d
.
Aşağıda alanda jeo-uzamsal dizin oluşturma örneği verilmiştir location
:
db.coll.createIndex({ location : "2dsphere" })
Metin dizinleri
MongoDB için Azure Cosmos DB şu anda metin dizinlerini desteklememektedir. Dizelerdeki metin arama sorguları için Azure Cosmos DB ile Azure AI Search tümleştirmesini kullanmanız gerekir.
Joker karakter dizinleri
Bilinmeyen alanlara yönelik sorguları desteklemek için joker karakter dizinlerini kullanabilirsiniz. Ailelerle ilgili verileri barındıran bir koleksiyonunuz olduğunu düşünelim.
Bu koleksiyondaki örnek belgenin bir bölümü aşağıda verilmiştir:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Bu kez içinde biraz farklı özellikler kümesi bulunan başka bir örnek aşağıda verilmişti children
:
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
Bu koleksiyonda, belgelerin birçok farklı olası özelliği olabilir. Dizideki children
tüm verilerin dizinini oluşturmak istiyorsanız iki seçeneğiniz vardır: her bir özellik için ayrı dizinler oluşturun veya dizinin tamamı children
için bir joker karakter dizini oluşturun.
Joker karakter dizini oluşturma
Aşağıdaki komut içindeki children
tüm özelliklerde bir joker karakter dizini oluşturur:
db.coll.createIndex({"children.$**" : 1})
MongoDB'den farklı olarak, joker dizinler sorgu koşullarında birden çok alanı destekleyebilir. Her özellik için ayrı bir dizin oluşturmak yerine tek bir joker karakter dizini kullanırsanız sorgu performansında bir fark olmayacaktır.
Joker karakter söz dizimini kullanarak aşağıdaki dizin türlerini oluşturabilirsiniz:
- Tek alan
- Jeo-uzamsal
Tüm özellikleri dizine ekleme
Tüm alanlarda joker karakter dizini şu şekilde oluşturabilirsiniz:
db.coll.createIndex( { "$**" : 1 } )
Azure portalındaki Veri Gezgini kullanarak joker karakter dizinleri de oluşturabilirsiniz:
Not
Geliştirmeye yeni başlıyorsanız, tüm alanlarda joker karakter diziniyle başlamanızı kesinlikle öneririz. Bu, geliştirmeyi basitleştirebilir ve sorguları iyileştirmeyi kolaylaştırabilir.
Birçok alanı olan belgelerde yazma işlemleri ve güncelleştirmeler için yüksek bir İstek Birimi (RU) ücreti olabilir. Bu nedenle, yoğun yazma içeren bir iş yükünüz varsa, joker karakter dizinlerini kullanmak yerine yolları tek tek dizine almayı tercih etmeniz gerekir.
Not
Veri içeren mevcut koleksiyonlarda benzersiz dizin desteği önizleme aşamasında sağlanır. Bu özellik, 'EnableUniqueIndexReIndex' özelliği etkinleştirilerek veritabanı hesabınız için etkinleştirilebilir.
Sınırlamalar
Joker dizinler aşağıdaki dizin türlerinden veya özelliklerinden hiçbirini desteklemez:
- Bileşik
- TTL
- Benzersiz
MongoDB'den farklı olarak MongoDB için Azure Cosmos DB'de aşağıdakiler için joker dizinleri kullanamazsınız:
Belirli birden çok alanın dahil edildiği bir joker dizin oluşturma
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection " : { "children.givenName" : 1, "children.grade" : 1 } } )
Belirli birden çok alanın hariç tutulduğu bir joker dizin oluşturma
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "children.givenName" : 0, "children.grade" : 0 } } )
Alternatif olarak birden çok joker dizin oluşturabilirsiniz.
Dizin özellikleri
Aşağıdaki işlemler, kablo protokolü sürüm 4.0'a hizmet veren hesaplar ve önceki sürümlere hizmet veren hesaplar için yaygındır. Desteklenen dizinler ve dizine alınan özellikler hakkında daha fazla bilgi edinebilirsiniz.
Benzersiz dizinler
Benzersiz dizinler , iki veya daha fazla belgenin dizinlenmiş alanlar için aynı değeri içermemesi için kullanışlıdır.
Aşağıdaki komut, alanında student_id
benzersiz bir dizin oluşturur:
globaldb:PRIMARY> db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Parçalı koleksiyonlar için benzersiz bir dizin oluşturmak için parça (bölüm) anahtarını sağlamanız gerekir. Başka bir deyişle, parçalanmış koleksiyondaki tüm benzersiz dizinler, alanlardan birinin parça anahtarı olduğu bileşik dizinlerdir. Siparişteki ilk alan parça anahtarı olmalıdır.
Aşağıdaki komutlar, ve alanlarında university
student_id
benzersiz bir dizine sahip bir parçalı koleksiyon coll
(parça anahtarıdıruniversity
) oluşturur:
globaldb:PRIMARY> db.runCommand({shardCollection: db.coll._fullName, key: { university: "hashed"}});
{
"_t" : "ShardCollectionResponse",
"ok" : 1,
"collectionsharded" : "test.coll"
}
globaldb:PRIMARY> db.coll.createIndex( { "university" : 1, "student_id" : 1 }, {unique:true});
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 3,
"numIndexesAfter" : 4
}
Yukarıdaki örnekte yan tümcesinin "university":1
atlanması aşağıdaki iletiyle birlikte bir hata döndürür:
cannot create unique index over {student_id : 1.0} with shard key pattern { university : 1.0 }
Sınırlamalar
Koleksiyon boşken benzersiz dizinlerin oluşturulması gerekir.
dizilerle ilgili sınırlamalar nedeniyle iç içe alanlardaki benzersiz dizinler varsayılan olarak desteklenmez. İç içe yerleştirilmiş alanınız bir dizi içermiyorsa, dizin amaçlandığı gibi çalışır. İç içe yerleştirilmiş alanınız bir dizi içeriyorsa (yolun herhangi bir yerinde), bu değer benzersiz dizinde yoksayılır ve bu değer için benzersizlik korunmaz.
Örneğin, yolda dizi olmadığından people.tom.age üzerindeki benzersiz bir dizin bu durumda çalışır:
{ "people": { "tom": { "age": "25" }, "mark": { "age": "30" } } }
ancak bu durumda çalışmaz çünkü yolda bir dizi vardır:
{ "people": { "tom": [ { "age": "25" } ], "mark": [ { "age": "30" } ] } }
Bu özellik veritabanı hesabınız için 'EnableUniqueCompoundNestedDocs' özelliği etkinleştirilerek etkinleştirilebilir.
TTL dizinleri
Belirli bir koleksiyonda belge süre sonunu etkinleştirmek için yaşam süresi (TTL) dizini oluşturmanız gerekir. TTL dizini, alanda değeri olan _ts
bir expireAfterSeconds
dizindir.
Örnek:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Yukarıdaki komut, koleksiyonda db.coll
son 10 saniye içinde değiştirilmemiş tüm belgeleri siler.
Not
_ts alanı Azure Cosmos DB'ye özgüdür ve MongoDB istemcilerinden erişilemez. Belgenin son değişikliğinin zaman damgasını içeren ayrılmış (sistem) bir özelliktir.
Dizin ilerleme durumunu izleme
MongoDB için Azure Cosmos DB'nin 3.6+ sürümü, veritabanı örneğinde dizin ilerleme durumunu izlemek için komutunu destekler currentOp()
. Bu komut, veritabanı örneğindeki devam eden işlemler hakkında bilgi içeren bir belge döndürür. Yerel MongoDB'de devam eden tüm işlemleri izlemek için komutunu kullanırsınız currentOp
. MongoDB için Azure Cosmos DB'de bu komut yalnızca dizin işlemini izlemeyi destekler.
Dizin ilerleme durumunu currentOp
izlemek için komutunun nasıl kullanılacağını gösteren bazı örnekler aşağıda verilmiştir:
Bir koleksiyon için dizin ilerleme durumunu alma:
db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})
Veritabanındaki tüm koleksiyonlar için dizin ilerleme durumunu alma:
db.currentOp({"command.$db": <databaseName>})
Azure Cosmos DB hesabındaki tüm veritabanları ve koleksiyonlar için dizin ilerleme durumunu alın:
db.currentOp({"command.createIndexes": { $exists : true } })
Dizin ilerleme durumu çıktısı örnekleri
Dizin ilerleme durumu ayrıntıları, geçerli dizin işlemi için ilerleme yüzdesini gösterir. Aşağıda, dizin ilerlemesinin farklı aşamaları için çıkış belgesi biçimini gösteren bir örnek verilmişti:
Yüzde 60'ı tamamlanmış bir "foo" koleksiyonu ve "çubuk" veritabanındaki dizin işlemi aşağıdaki çıkış belgesine sahip olur. Alanda
Inprog[0].progress.total
hedef tamamlanma yüzdesi olarak 100 gösterilir.{ "inprog" : [ { ………………... "command" : { "createIndexes" : foo "indexes" :[ ], "$db" : bar }, "msg" : "Index Build (background) Index Build (background): 60 %", "progress" : { "done" : 60, "total" : 100 }, …………..….. } ], "ok" : 1 }
"Foo" koleksiyonu ve "çubuk" veritabanında dizin işlemi yeni başladıysa, çıkış belgesi ölçülebilir bir düzeye ulaşana kadar yüzde 0 ilerleme gösteriyor olabilir.
{ "inprog" : [ { ………………... "command" : { "createIndexes" : foo "indexes" :[ ], "$db" : bar }, "msg" : "Index Build (background) Index Build (background): 0 %", "progress" : { "done" : 0, "total" : 100 }, …………..….. } ], "ok" : 1 }
Devam eden dizin işlemi tamamlandığında, çıkış belgesinde boş
inprog
işlemler gösterilir.{ "inprog" : [], "ok" : 1 }
Arka plan dizini güncelleştirmeleri
Background dizin özelliği için belirtilen değerden bağımsız olarak, dizin güncelleştirmeleri her zaman arka planda yapılır. Dizin güncelleştirmeleri diğer veritabanı işlemlerinden daha düşük bir önceliğe sahip İstek Birimlerini (RU) tükettiğinden, dizin değişiklikleri yazma, güncelleştirme veya silme işlemleri için kapalı kalma süresine neden olmaz.
Yeni dizin eklerken okuma kullanılabilirliğini etkilemez. Sorgular yalnızca dizin dönüşümü tamamlandıktan sonra yeni dizinleri kullanır. Dizin dönüştürme sırasında sorgu altyapısı mevcut dizinleri kullanmaya devam eder, bu nedenle dizin oluşturma dönüştürmesi sırasında dizin oluşturma değişikliğini başlatmadan önce gözlemlediğinize benzer okuma performansını gözlemlersiniz. Yeni dizinler eklerken, eksik veya tutarsız sorgu sonuçları riski de yoktur.
Dizinler kaldırılırken ve bırakılan dizinlerde filtreleri olan sorgular hemen çalıştırılırken, dizin dönüştürme işlemi tamamlanana kadar sonuçlar tutarsız ve eksik olabilir. Dizinleri kaldırırsanız, sorgular bu yeni kaldırılan dizinleri filtrelediğinde sorgu altyapısı tutarlı veya eksiksiz sonuçlar sağlamaz. Geliştiricilerin çoğu dizinleri bırakmaz ve hemen sorgulamaya çalışır, bu nedenle pratikte bu durum pek olası değildir.
Not
Dizin ilerleme durumunu izleyebilirsiniz.
ReIndex komutu
komutu bir reIndex
koleksiyondaki tüm dizinleri yeniden oluşturur. Bazı nadir durumlarda, sorgu performansı veya koleksiyonunuzdaki diğer dizin sorunları komutu çalıştırılarak reIndex
çözülebilir. Dizin oluşturmayla ilgili sorunlarla karşılaşıyorsanız, dizinleri komutuyla reIndex
yeniden oluşturmak önerilen bir yaklaşımdır.
Komutunu aşağıdaki söz dizimini reIndex
kullanarak çalıştırabilirsiniz:
db.runCommand({ reIndex: <collection> })
Komutunun çalıştırılmasının koleksiyonunuzdaki sorgu performansını geliştirip geliştirmeyeceğini denetlemek için aşağıdaki söz dizimini reIndex
kullanabilirsiniz:
db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})
Örnek çıkış:
{
"database" : "myDB",
"collection" : "myCollection",
"provisionedThroughput" : 400,
"indexes" : [
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "myDB.myCollection",
"requiresReIndex" : true
},
{
"v" : 1,
"key" : {
"b.$**" : 1
},
"name" : "b.$**_1",
"ns" : "myDB.myCollection",
"requiresReIndex" : true
}
],
"ok" : 1
}
Sorgu performansını geliştirecekse reIndex
requiresReIndex true olacaktır. Sorgu performansını iyileştirmezse reIndex
, bu özellik atlanır.
Dizinlerle koleksiyonları geçirme
Şu anda yalnızca koleksiyon belge içermediğinde benzersiz dizinler oluşturabilirsiniz. Popüler MongoDB geçiş araçları, verileri içeri aktardıktan sonra benzersiz dizinleri oluşturmaya çalışır. Bu sorunu aşmak için, geçiş aracının denemesine izin vermek yerine ilgili koleksiyonları ve benzersiz dizinleri el ile oluşturabilirsiniz. (Bu davranışı için mongorestore
komut satırında bayrağını --noIndexRestore
kullanarak gerçekleştirebilirsiniz.)
MongoDB sürüm 3.2 için dizin oluşturma
MongoDB kablo protokolünün 3.2 sürümüyle uyumlu Azure Cosmos DB hesapları için kullanılabilir dizin oluşturma özellikleri ve varsayılanları farklıdır. Hesabınızın sürümünü denetleyebilir ve 3.6 sürümüne yükseltebilirsiniz.
Sürüm 3.2 kullanıyorsanız, bu bölümde 3.6 ve üzeri sürümlerle önemli farklar özetlenmektedir.
Varsayılan dizinler bırakılıyor (sürüm 3.2)
MongoDB için Azure Cosmos DB'nin 3.6+ sürümünden farklı olarak, sürüm 3.2 varsayılan olarak her özelliği dizine alır. Bir koleksiyoncoll
için bu varsayılan dizinleri () bırakmak için aşağıdaki komutu kullanabilirsiniz:
> db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Varsayılan dizinleri bıraktıktan sonra, 3.6+ sürümünde olduğu gibi daha fazla dizin ekleyebilirsiniz.
Bileşik dizinler (sürüm 3.2)
Bileşik dizinler bir belgenin birden çok alanına başvurular içerir. Bileşik dizin oluşturmak istiyorsanız 3.6 veya 4.0 sürümüne yükseltin.
Joker dizinler (sürüm 3.2)
Joker karakter dizini oluşturmak istiyorsanız 4.0 veya 3.6 sürümüne yükseltin.
Sonraki adımlar
- Azure Cosmos DB’de dizin oluşturma
- Azure Cosmos DB'de verilerin yaşam süresiyle otomatik olarak süresinin dolması
- Bölümleme ve dizin oluşturma arasındaki ilişki hakkında bilgi edinmek için Azure Cosmos DB kapsayıcısını sorgulama makalesine bakın.
- Azure Cosmos DB'ye geçiş için kapasite planlaması yapmaya mı çalışıyorsunuz? Kapasite planlaması için mevcut veritabanı kümeniz hakkındaki bilgileri kullanabilirsiniz.
- Tek bildiğiniz mevcut veritabanı kümenizdeki sanal çekirdek ve sunucu sayısıysa, sanal çekirdekleri veya vCPU'ları kullanarak istek birimlerini tahmin etme hakkında bilgi edinin
- Geçerli veritabanı iş yükünüz için tipik istek oranlarını biliyorsanız Azure Cosmos DB kapasite planlayıcısı kullanarak istek birimlerini tahmin etme hakkında bilgi edinin