Správa indexování v rozhraní API služby Azure Cosmos DB pro MongoDB
PLATÍ pro:
Azure Cosmos DB API pro MongoDB
Rozhraní API služby Azure Cosmos DB pro MongoDB využívá základní možnosti správy indexů služby Azure Cosmos DB. Tento článek se zaměřuje na přidání indexů pomocí rozhraní API služby Azure Cosmos DB pro MongoDB. Indexy jsou specializované datové struktury, které urychlují dotazování dat zhruba o řád rychleji.
Indexování serveru MongoDB verze 3.6 a vyšší
Rozhraní API služby Azure Cosmos DB pro server MongoDB verze 3.6 nebo novější automaticky indexuje pole a klíč horizontálního dělení (pouze v _id shardovaných kolekcích). Rozhraní API automaticky vynucuje jedinečnost pole _id na klíč horizontálního dělení.
Rozhraní API pro MongoDB se chová jinak než rozhraní API služby Azure Cosmos DB SQL, které ve výchozím nastavení indexuje všechna pole.
Úprava zásad indexování
Doporučujeme upravit zásady indexování v Průzkumník dat v Azure Portal. . Indexy s jedním polem a zástupnými znaky můžete přidat z editoru zásad indexování v Průzkumník dat:
Poznámka
Složené indexy nemůžete vytvářet pomocí editoru zásad indexování v Průzkumník dat.
Typy indexů
Jedno pole
Indexy můžete vytvořit pro jakékoli jedno pole. Pořadí řazení indexu s jedním polem není důležité. Následující příkaz vytvoří index pro pole name :
db.coll.createIndex({name:1})
Stejný index jednoho pole můžete vytvořit v name souboru Azure Portal:
Jeden dotaz používá několik indexů s jedním polem, pokud je k dispozici. Pro každou kolekci můžete vytvořit až 500 indexů s jedním polem.
Složené indexy (server MongoDB verze 3.6 nebo novější)
V rozhraní API pro MongoDB se složené indexy vyžaduje, pokud váš dotaz potřebuje mít možnost seřadit více polí najednou. U dotazů s více filtry, které nemusí řadit, vytvořte místo složeného indexu více indexů s jedním polem, abyste ušetřily na nákladech na indexování.
Složený index nebo indexy s jedním polem pro každé pole ve složeném indexu budou mít za následek stejný výkon pro filtrování v dotazech.
Poznámka
Složené indexy nelze vytvářet u vnořených vlastností nebo polí.
Následující příkaz vytvoří složený index pro pole a name age :
db.coll.createIndex({name:1,age:1})
Složené indexy můžete použít k efektivnímu řazení podle více polí najednou, jak je znázorněno v následujícím příkladu:
db.coll.find().sort({name:1,age:1})
Můžete také použít předchozí složený index k efektivnímu řazení dotazu s opačným pořadím řazení u všech polí. Tady je příklad:
db.coll.find().sort({name:-1,age:-1})
Sekvence cest ve složeném indexu se ale musí přesně shodovat s dotazem. Tady je příklad dotazu, který by vyžadoval další složený index:
db.coll.find().sort({age:1,name:1})
Poznámka
Složené indexy se používají pouze v dotazech, které seřadí výsledky. Pro dotazy, které mají více filtrů, které není potřeba řadit, vytvořte indexy s více poli s jedním polem.
Indexy s více klíči
Azure Cosmos DB vytváří indexy s více klíči pro indexování obsahu uloženého v polích. Pokud indexuje pole s hodnotou pole, Azure Cosmos DB automaticky indexuje každý prvek v poli.
Geoprostorové indexy
Mnoho geoprostorových operátorů bude těžit z geoprostorových indexů. Rozhraní API služby Azure Cosmos DB pro MongoDB v současné době 2dsphere podporuje indexy. Rozhraní API zatím 2d indexy nepodporuje.
Tady je příklad vytvoření geoprostorového indexu pro location pole:
db.coll.createIndex({ location : "2dsphere" })
Textové indexy
Rozhraní API služby Azure Cosmos DB pro MongoDB v současné době nepodporuje textové indexy. U textových vyhledávacích dotazů na řetězce byste měli použít Azure Cognitive Search s Azure Cosmos DB.
Indexy se zástupnými znaky
K podpoře dotazů na neznámá pole můžete použít indexy se zástupnými znaky. Představte si, že máte kolekci, která obsahuje data o rodinách.
Tady je část příkladu dokumentu v této kolekci:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Tady je další příklad, tentokrát s mírně odlišnou sadu vlastností v children souboru :
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
V této kolekci mohou mít dokumenty mnoho různých možných vlastností. Pokud chcete indexovat všechna data v poli, máte dvě možnosti: vytvořit samostatné indexy pro každou jednotlivou vlastnost nebo vytvořit jeden index se zástupnými children znaky pro celé children pole.
Vytvoření indexu se zástupnými znaky
Následující příkaz vytvoří index se zástupnými znaky u všech vlastností v rámci children :
db.coll.createIndex({"children.$**" : 1})
Na rozdíl od MongoDB mohou indexy se zástupnými znaky podporovat více polí v predikátůch dotazů. Pokud místo vytvoření samostatného indexu pro každou vlastnost použijete jeden index se zástupnými znaky, nebude výkon dotazu žádný rozdíl.
Pomocí syntaxe se zástupnými znaky můžete vytvořit následující typy indexů:
- Jedno pole
- Geoprostorové
Indexování všech vlastností
Tady je postup, jak vytvořit index se zástupnými znaky pro všechna pole:
db.coll.createIndex( { "$**" : 1 } )
Indexy se zástupnými znaky můžete vytvořit také pomocí Průzkumník dat v Azure Portal:
Poznámka
Pokud právě začínáte s vývojem, důrazně doporučujeme začít s indexem se zástupnými znaky u všech polí. To může zjednodušit vývoj a usnadnit optimalizaci dotazů.
Za dokumenty s mnoha poli se může účtovat vysoký poplatek za jednotku žádosti (RU) za zápisy a aktualizace. Proto pokud máte úlohy náročné na zápis, měli byste se místo indexů se zástupnými znaky rozhodnout pro jednotlivé cesty indexů.
Omezení
Indexy se zástupnými znaky nepodporují žádné z následujících typů nebo vlastností indexů:
- Složené
- TTL
- Jedinečná
Na rozdíl od MongoDB nemůžete v rozhraní API služby Azure Cosmos DB pro MongoDB používat indexy se zástupnými znaky pro:
Vytvořit index se zástupnými znaky, který zahrnuje několik konkrétních polí
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection " : { "children.givenName" : 1, "children.grade" : 1 } } )Vytvořit index se zástupnými znaky, který vylučuje několik konkrétních polí
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "children.givenName" : 0, "children.grade" : 0 } } )
Jako alternativu můžete vytvořit několik indexů se zástupnými znaky.
Vlastnosti indexu
Následující operace jsou běžné pro účty obsluhující wire protocol verze 4.0 a účty obsluhující starší verze. Můžete si zobrazit další informace o podporovaných indexech a indexovaných vlastnostech.
Jedinečné indexy
Jedinečné indexy jsou užitečné pro vynucení, aby dva nebo více dokumentů neobsahují pro indexovaná pole stejnou hodnotu.
Důležité
Jedinečné indexy lze vytvořit pouze v případě, že je kolekce prázdná (neobsahuje žádné dokumenty).
Následující příkaz vytvoří jedinečný index pro pole student_id :
globaldb:PRIMARY> db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Pro shardované kolekce musíte zadat klíč horizontálního dělení (oddílu) pro vytvoření jedinečného indexu. Jinými slovy, všechny jedinečné indexy u horizontálně dělené kolekce jsou složené indexy, ve kterých je jedno z polí klíčem oddílu.
Následující příkazy vytvoří shardované kolekce coll (klíč horizontálního dělení je ) s university jedinečným indexem polí a student_id university :
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
}
V předchozím příkladu vynechání klauzule "university":1 vrátí chybu s následující zprávou:
nemůže vytvořit jedinečný index přes {student_id: 1.0} se vzorem klíče horizontálního dělení { university: 1.0 }
Indexy TTL
Pokud chcete v konkrétní kolekci povolit vypršení platnosti dokumentu, musíte vytvořit index TTL (Time to Live). Index TTL je index pole _ts s expireAfterSeconds hodnotou.
Příklad:
globaldb:PRIMARY> db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Předchozí příkaz odstraní všechny dokumenty v kolekci, které se během posledních db.coll 10 sekund neupravily.
Poznámka
Pole _ts je specifické pro Azure Cosmos DB a není přístupné z klientů MongoDB. Jedná se o rezervovanou (systémovou) vlastnost, která obsahuje časové razítko poslední úpravy dokumentu.
Sledování průběhu indexu
Verze 3.6 nebo novější rozhraní API služby Azure Cosmos DB pro MongoDB podporuje příkaz ke sledování průběhu currentOp() indexování instance databáze. Tento příkaz vrátí dokument, který obsahuje informace o probíhajících operacích instance databáze. Pomocí příkazu můžete currentOp sledovat všechny probíhající operace v nativním MongoDB. v rozhraní Azure Cosmos DB API pro MongoDB tento příkaz podporuje pouze sledování operace indexu.
Tady je několik příkladů, které ukazují, jak pomocí currentOp příkazu sledovat průběh indexu:
Získat průběh indexu pro kolekci:
db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})Získat průběh indexu pro všechny kolekce v databázi:
db.currentOp({"command.$db": <databaseName>})získejte průběh indexu pro všechny databáze a kolekce v účtu Azure Cosmos:
db.currentOp({"command.createIndexes": { $exists : true } })
Příklady výstupu průběhu indexu
Podrobnosti o průběhu indexu zobrazují procento průběhu aktuální operace indexu. Tady je příklad, který ukazuje formát výstupního dokumentu pro různé fáze průběhu indexu:
Operace indexu v kolekci "foo" a "bar" databáze, která je 60% dokončená, bude mít následující výstupní dokument. V
Inprog[0].progress.totalpoli se zobrazí 100 jako procento cíle dokončení.{ "inprog" : [ { ………………... "command" : { "createIndexes" : foo "indexes" :[ ], "$db" : bar }, "msg" : "Index Build (background) Index Build (background): 60 %", "progress" : { "done" : 60, "total" : 100 }, …………..….. } ], "ok" : 1 }Pokud byla operace indexu právě spuštěna v kolekci "foo" a "bar" databáze, výstupní dokument může zobrazit 0 procent průběhu až do dosažení měřitelné úrovně.
{ "inprog" : [ { ………………... "command" : { "createIndexes" : foo "indexes" :[ ], "$db" : bar }, "msg" : "Index Build (background) Index Build (background): 0 %", "progress" : { "done" : 0, "total" : 100 }, …………..….. } ], "ok" : 1 }Po dokončení probíhající operace indexu zobrazí výstupní dokument prázdné
inprogoperace.{ "inprog" : [], "ok" : 1 }
Aktualizace indexu na pozadí
Bez ohledu na hodnotu zadanou pro vlastnost index na pozadí jsou aktualizace indexu vždy prováděny na pozadí. Vzhledem k tomu, že aktualizace indexu spotřebovávají jednotky žádostí (ru) s nižší prioritou než jiné databázové operace, nebudou mít změny v indexu žádný výpadek pro zápisy, aktualizace nebo odstranění.
Při přidávání nového indexu nemá žádný vliv na dostupnost čtení. Po dokončení transformace indexu budou dotazy využívat pouze nové indexy. Při transformaci indexu bude modul dotazu dál používat stávající indexy, takže budete mít podobný výkon při čtení během transformace indexování na to, co jste předtím provedli při zahájení změny indexování. Při přidávání nových indexů nehrozí riziko neúplných nebo nekonzistentních výsledků dotazu.
Při odebírání indexů a okamžitém spuštění dotazů mají filtry na vyřazených indexech, výsledky mohou být nekonzistentní a nedokončené, dokud se nedokončí transformace indexu. Pokud odeberete indexy, dotazovací stroj neposkytne konzistentní nebo úplné výsledky, když dotazy filtrují na těchto nově odebraných indexech. Většina vývojářů neprovádí vyřazení indexů a potom se okamžitě pokusí o dotazování, takže v praxi je tato situace nepravděpodobná.
Poznámka
Příkaz Reindexovat
reIndexPříkaz znovu vytvoří všechny indexy v kolekci. Ve výjimečných případech může být výkon dotazů nebo jiné problémy indexu v kolekci vyřešen spuštěním reIndex příkazu. Pokud máte potíže s indexováním, je doporučený postup opětovného vytváření indexů pomocí reIndex příkazu.
Příkaz můžete spustit reIndex pomocí následující syntaxe:
db.runCommand({ reIndex: <collection> })
Pomocí následující syntaxe můžete zjistit, jestli spuštění reIndex příkazu vylepšit výkon dotazů v kolekci:
db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})
Ukázkový výstup:
{
"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
}
Pokud reIndex aplikace zvýší výkon dotazů, requiresReIndex bude true. Pokud reIndex nedojde ke zvýšení výkonu dotazů, bude tato vlastnost vynechána.
Migrace kolekcí s indexy
V současné době je možné vytvořit jedinečné indexy pouze v případě, že kolekce neobsahuje žádné dokumenty. Oblíbené nástroje pro migraci MongoDB se po importu dat pokoušejí vytvořit jedinečné indexy. Pokud chcete tento problém obejít, můžete ručně vytvořit odpovídající kolekce a jedinečné indexy místo toho, aby se mohl nástroj pro migraci vyzkoušet. (Toto chování můžete dosáhnout pro pomocí mongorestore --noIndexRestore příznaku v příkazovém řádku.)
Indexování pro MongoDB verze 3,2
dostupné funkce indexování a výchozí hodnoty se liší pro účty Azure Cosmos, které jsou kompatibilní s verzí 3,2 přenosového protokolu MongoDB. Můžete si ověřit verzi vašeho účtu a upgradovat na verzi 3,6.
Pokud používáte verzi 3,2, Tato část popisuje klíčové rozdíly ve verzích 3.6 +.
Vyřazení výchozích indexů (verze 3,2)
na rozdíl od 3,6 + verze rozhraní Azure Cosmos DB API pro MongoDB verze 3,2 indexuje každou vlastnost ve výchozím nastavení. K vyřazení těchto výchozích indexů pro kolekci () můžete použít následující příkaz coll :
> db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Po vyřazení výchozích indexů můžete přidat další indexy stejným způsobem jako ve verzi 3.6 +.
Složené indexy (verze 3,2)
Složené indexy obsahují odkazy na více polí dokumentu. Pokud chcete vytvořit složený index, upgradujte na verzi 3,6 nebo 4,0.
Indexy zástupných znaků (verze 3,2)
Pokud chcete vytvořit index zástupného znaku, upgradujte na verzi 4,0 nebo 3,6.
Další kroky
- Indexování ve službě Azure Cosmos DB
- automatické vypršení platnosti dat v Azure Cosmos DB s časem až live
- další informace o vztahu mezi vytvářením oddílů a indexováním najdete v článku postup dotazování na kontejner Azure Cosmos .
- chcete se pokusit plánování kapacity pro migraci na Azure Cosmos DB? Pro plánování kapacity můžete použít informace o vašem existujícím databázovém clusteru.
- Pokud znáte počet virtuální jádra a serverů v existujícím databázovém clusteru, přečtěte si téma odhadování jednotek žádostí pomocí virtuální jádra nebo vCPU .
- pokud znáte typické míry požadavků pro aktuální databázovou úlohu, přečtěte si téma odhadace jednotek žádostí pomocí Azure Cosmos DB kapacity plánovače .