Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
MongoDB için Azure Cosmos DB, sorgu performansını hızlandırmak için dizin oluşturmayı kullanmanıza olanak tanır. Bu makalede, daha hızlı veri alma ve daha iyi verimlilik için dizinleri yönetme ve iyileştirme işlemleri gösterilmektedir.
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+ _id alanını ve ayrım anahtarını (yalnızca parçalanmış koleksiyonlarda) otomatik olarak dizine alır. API, parça anahtarı başına alanın benzersizliğini _id zorlar.
MongoDB API'si, tüm alanları varsayılan olarak dizinleyen NoSQL için Azure Cosmos DB'den farklı çalışır.
Dizin oluşturma ilkesini düzenleme
Dizin oluşturma ilkenizi Azure portalındaki Veri Gezgini'nde düzenleyin. Veri Gezgini'ndeki dizin oluşturma ilkesi düzenleyicisinden tek alan ve joker karakter dizinleri ekleyin:
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 dizin oluşturun. Tek alan dizininin sıralama düzeni önemli değildir. alanında namebir dizin oluşturmak için aşağıdaki komutu kullanın:
db.coll.createIndex({name:1})
Azure portalında aynı name tek alan dizinini oluşturun:
Sorgu, kullanılabilir durumda birden çok tek alan dizini kullanır. Koleksiyon başına en fazla 500 tek alan dizini oluşturun.
Bileşik dizinler (MongoDB sunucusu sürüm 3.6+)
MongoDB API'sinde, aynı anda birden çok alanı sıralayan sorgularla bileşik dizinleri kullanın. 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ş bir alanın dizisi yoksa, dizin amaçlandığı gibi çalışır. İç içe yerleştirilmiş bir alan, yolun herhangi bir yerinde bir diziye sahipse, bu değer dizinde yoksayılır.
Örneğin, yolunun people.dylan.age üzerinde dizi olmadığından, içeren bir bileşik dizin bu durumda çalışır:
{
"people": {
"dylan": {
"name": "Dylan",
"age": "25"
},
"reed": {
"name": "Reed",
"age": "30"
}
}
}
Aynı bileşik dizin bu durumda çalışmaz çünkü yolda bir dizi vardır:
{
"people": [
{
"name": "Dylan",
"age": "25"
},
{
"name": "Reed",
"age": "30"
}
]
}
'EnableUniqueCompoundNestedDocs' özelliğini etkinleştirerek veritabanı hesabınız için bu özelliği etkinleştirin.
Not
Dizilerde bileşik dizinler oluşturamazsınız.
Aşağıdaki komut, name ve age alanlarında 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, dizilerdeki 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 dizinler.
Jeo-uzamsal dizinler
Jeo-uzamsal operatörlerin çoğu jeo-uzamsal dizinlerden yararlanmaktadır. MongoDB için Azure Cosmos DB dizinleri destekler 2dsphere . API henüz dizinleri desteklemez 2d .
İşte location alanında jeo-uzamsal dizin oluşturma örneği:
db.coll.createIndex({ location : "2dsphere" })
Metin dizinleri
MongoDB için Azure Cosmos DB metin dizinlerini desteklemez. Dizelerdeki metin arama sorguları için Azure Cosmos DB ile Azure AI Search tümleştirmesini kullanın.
Wildcard indeksleri
Bilinmeyen alanlara yönelik sorguları desteklemek için joker karakter dizinlerini kullanın. Aileler hakkında veri içeren bir koleksiyon düşünün.
Bu koleksiyondaki örnek belgenin bir bölümü aşağıda verilmişti:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Burada, içinde farklı bir özellik kümesine sahip başka bir örnek verilmişti children:
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
Bu koleksiyondaki belgelerin birçok farklı özelliği olabilir. Dizideki children tüm verileri dizine almak için her özellik için ayrı dizinler oluşturun veya dizinin tamamı children için bir joker karakter dizini oluşturun.
Joker karakter dizini oluşturma
içindeki childrenözelliklerde joker karakter dizini oluşturmak için aşağıdaki komutu kullanın:
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 yoktur.
Joker karakter söz dizimini kullanarak aşağıdaki dizin türlerini oluşturun:
- Tek alan
- Jeo-uzamsal
Tüm özellikleri dizine ekleme
Aşağıdaki komutla tüm alanlarda joker karakter dizini oluşturun:
db.coll.createIndex( { "$**" : 1 } )
Azure portalında Veri Gezgini'ni kullanarak joker karakter dizinleri oluşturun:
Not
Geliştirmeye yeni başlıyorsanız, tüm alanlarda joker karakter diziniyle başlayın. Bu yaklaşım geliştirmeyi basitleştirir ve sorguları iyileştirmeyi kolaylaştırır.
Birçok alanı olan belgelerde yazma işlemleri ve güncelleştirmeler için yüksek bir İstek Birimi (RU) ücreti olabilir. Yoğun yazma içeren bir iş yükünüz varsa joker karakterler yerine tek tek dizine alınan yolları kullanın.
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şturun.
Dizin özellikleri
Aşağıdaki işlemler, kablo protokolü sürüm 4.0 ve önceki sürümleri kullanan hesaplar için yaygındır. Desteklenen dizinler ve dizine alınan özellikler hakkında daha fazla bilgi edinin.
Benzersiz dizinler
Benzersiz dizinler , iki veya daha fazla belgenin dizinlenmiş alanlar için aynı değere sahip olmadığından emin olmanıza yardımcı olur.
Alanda benzersiz bir dizin student_id oluşturmak için aşağıdaki komutu çalıştırın:
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ğlayın. Parçalı koleksiyondaki tüm benzersiz dizinler bileşik dizinlerdir ve alanlardan biri parça anahtarıdır. Parça anahtarı, dizin tanımındaki ilk alan olmalıdır.
ve alanlarında (collparça anahtarı olarak) adlı bir parçalı koleksiyon university ve benzersiz bir dizin student_iduniversity oluşturmak için aşağıdaki komutları çalıştırın:
db.runCommand({shardCollection: db.coll._fullName, key: { university: "hashed"}});
{
"_t" : "ShardCollectionResponse",
"ok" : 1,
"collectionsharded" : "test.coll"
}
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ümcesini "university":1 atlarsanız aşağıdaki hata iletisini görürsünüz:
cannot create unique index over {student_id : 1.0} with shard key pattern { university : 1.0 }
Sınırlamalar
Koleksiyon boşken benzersiz dizinler oluşturun.
Sürekli yedeklemeye sahip MongoDB için Azure Cosmos DB hesapları, mevcut bir koleksiyon için benzersiz dizin oluşturmayı desteklemez. Böyle bir hesap için benzersiz dizinlerin koleksiyon oluşturma işlemiyle birlikte oluşturulması gerekir. Bu dizinler yalnızca koleksiyon uzantısı oluşturma komutları kullanılarak yapılmalıdır ve yapılabilir.
db.runCommand({customAction:"CreateCollection", collection:"coll", shardKey:"student_id", indexes:[
{key: { "student_id" : 1}, name:"student_id_1", unique: true}
]});
dizilerle ilgili sınırlamalar nedeniyle iç içe alanlardaki benzersiz dizinler varsayılan olarak desteklenmez. İç içe yerleştirilmiş alanınızda bir dizi yoksa, dizin amaçlandığı gibi çalışır. İç içe alanınızda yolun herhangi bir yerinde bir dizi varsa, bu değer benzersiz dizinde yoksayılır ve benzersizlik bu değer için korunmaz.
Örneğin, yolunda people.tom.age dizi olmadığından, üzerindeki benzersiz bir dizin bu durumda çalışır:
{
"people": {
"tom": {
"age": "25"
},
"mark": {
"age": "30"
}
}
}
Ancak bu durumda işe yaramaz çü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
Bir koleksiyonda belgelerin süresinin dolmasına izin vermek için bir yaşam süresi (TTL) dizini oluşturun. TTL dizini, _ts alanında expireAfterSeconds değeri olan bir dizindir.
Örnek:
db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Yukarıdaki komut, koleksiyondaki db.coll 10 saniyeden daha önce değiştirilmiş 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.
currentOp Yerel MongoDB'de devam eden tüm işlemleri izlemek için komutunu kullanın. MongoDB için Azure Cosmos DB'de bu komut yalnızca dizin işlemini izler.
Dizin ilerleme durumunu izlemek için komutunun nasıl kullanılacağına currentOp ilişkin 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çimi örnekleri verilmiştir:
Yüzde 60'ı tamamlanmış bir "foo" koleksiyonu ve "çubuk" veritabanındaki dizin işlemi aşağıdaki çıkış belgesine sahiptir. Alanda
Inprog[0].progress.totalhedef 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 }Bir dizin işlemi "foo" koleksiyonu ve "çubuk" veritabanında yeni başladıysa, çıkış belgesi ölçülebilir bir düzeye ulaşana kadar yüzde 0 ilerleme gösterebilir.
{ "inprog": [ { ... "command": { "createIndexes": foo "indexes": [], "$db": bar }, "msg": "Index Build (background) Index Build (background): 0 %", "progress": { "done": 0, "total": 100 }, ... } ], "ok": 1 }Dizin işlemi tamamlandığında, çıkış belgesinde boş
inprogişlemler gösterilir.{ "inprog" : [], "ok" : 1 }
Arka plan dizini güncelleştirmeleri
Arka plan dizin özelliği için hangi değeri ayarlarsanız ayarlayın, dizin güncelleştirmeleri her zaman arka planda çalışır. Dizin güncelleştirmeleri diğer veritabanı eylemlerinden daha düşük öncelikli İstek Birimleri (RU) kullandığından, dizin değişiklikleri yazma, güncelleştirme veya silme işlemleri için kapalı kalma süresine neden olmaz.
Yeni dizin eklemek, okuma kullanılabilirliğini etkilemez. Sorgular yalnızca dizin dönüşümü tamamlandıktan sonra yeni dizinleri kullanır. Dönüştürme sırasında sorgu altyapısı mevcut dizinleri kullanmaya devam eder, böylece dizin oluşturma değişikliğini başlatmadan öncekine benzer bir okuma performansı görürsünüz. Yeni dizinler eklemek, eksik veya tutarsız sorgu sonuçlarını riske atamaz.
Dizinleri kaldırır ve bırakılan dizinleri filtreleyen sorguları hemen çalıştırırsanız, dizin dönüştürme işlemi tamamlanana kadar sonuçlar tutarsız ve eksik olabilir. Sorgu altyapısı, yeni kaldırılan dizinleri filtreleyen sorgular için tutarlı veya eksiksiz sonuçlar sağlamaz. Geliştiricilerin çoğu dizinleri bırakmaz ve hemen sorgulamaz, bu nedenle bu durum pek olası değildir.
Not
Dizin ilerleme durumunu izleyebilirsiniz.
reIndex komut
komutu bir reIndex koleksiyondaki tüm dizinleri yeniden oluşturur. Nadir durumlarda komutunu çalıştırmak reIndex sorgu performansını veya koleksiyonunuzdaki diğer dizin sorunlarını düzeltebilir. Dizin oluşturma sorunlarıyla karşılaşıyorsanız, komutuyla reIndex dizinleri yeniden oluşturmayı deneyin.
reIndex Komutunu aşağıdaki söz dizimini kullanarak çalıştırın:
db.runCommand({ reIndex: <collection> })
Komutunu çalıştırmanın reIndex koleksiyonunuzdaki sorgu performansını geliştirip geliştirmediğini denetlemek için aşağıdaki söz dizimini kullanın:
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ı artırırsa reIndex , requiresReIndex true değeridir. Sorgu performansını iyileştirmezse reIndex , bu özellik atlanır.
Dizinlerle koleksiyonları taşıma
Yalnızca koleksiyonda belge olmadığında benzersiz dizinler oluşturabilirsiniz. Popüler MongoDB geçiş araçları, verileri içeri aktardıktan sonra benzersiz dizinler oluşturmaya çalışır. Bu sorunu geçici olarak çözmek için, geçiş aracının denemesine izin vermek yerine ilgili koleksiyonları ve benzersiz dizinleri el ile oluşturun. Bu davranışı için mongorestore komut satırında bayrağını --noIndexRestore kullanarak elde edebilirsiniz.
MongoDB sürüm 3.2 için dizin oluşturma
MongoDB kablo protokolünün 3.2 sürümünü kullanan Azure Cosmos DB hesapları için dizin oluşturma özellikleri ve varsayılanları farklıdır. Hesabınızın feature-support-36.md#protocol-support adresinden sürümünü denetleyin ve upgrade-version.md'da sürüm 3.6'ya yükseltin.
Sürüm 3.2 kullanıyorsanız, bu bölümde 3.6 ve sonraki sürümlerden önemli farklar vurgulanır.
Varsayılan dizinlerin kaldırılması (sürüm 3.2)
3.6 ve sonraki sürümlerden farklı olarak MongoDB için Azure Cosmos DB sürüm 3.2 varsayılan olarak her özelliği dizine alır. Bir koleksiyon için bu varsayılan dizinleri (coll) bırakmak için aşağıdaki komutu kullanın:
db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Varsayılan dizinleri bıraktıktan sonra, sürüm 3.6 ve sonraki sürümlerde yaptığınız gibi daha fazla dizin ekleyin.
Bileşik dizinler (sürüm 3.2)
Bileşik dizinler bir belgedeki birden çok alana başvurur. Bileşik dizin oluşturmak için upgrade-version.md 3.6 veya 4.0 sürümüne yükseltin.
Wildcard indeksler (sürüm 3.2)
Joker karakter dizini oluşturmak için upgrade-version.md'de 4.0 veya 3.6 sürümüne yükseltin.