Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Important
Chcete migrovat existující aplikaci MongoDB nebo používat funkce jazyka MQL (MongoDB Query Language)? Zvažte Azure DocumentDB.
Hledáte databázové řešení pro scénáře ve velkém měřítku s 99,999% smlouvou o úrovni služeb (SLA), okamžitým automatickým škálováním a automatickým převzetím služeb při selhání napříč několika oblastmi? Zvažte Azure Cosmos DB pro NoSQL.
Azure Cosmos DB pro MongoDB umožňuje zrychlit výkon dotazů pomocí indexování. V tomto článku se dozvíte, jak spravovat a optimalizovat indexy pro rychlejší načítání dat a lepší efektivitu.
Indexování pro server MongoDB verze 3.6 a vyšší
Azure Cosmos DB Server pro MongoDB verze 3.6+ automaticky indexuje _id pole a klíč pro shardování (pouze v rozdělených kolekcích). Rozhraní API vynucuje jedinečnost pole pro každý _id shard klíč.
Rozhraní API pro MongoDB funguje jinak než Azure Cosmos DB for NoSQL, které ve výchozím nastavení indexuje všechna pole.
Úprava zásad indexování
Upravte zásady indexování v Průzkumníku dat na webu Azure Portal. Přidejte indexy s jednoduchým polem a zástupným znakem z editoru zásad indexování v Průzkumníku dat.
Note
Složené indexy nemůžete vytvářet pomocí editoru zásad indexování v Průzkumníku dat.
Typy indexů
Jedno pole
Vytvořte index pro každé jedno pole. Pořadí řazení indexu s jedním polem nezáleží. K vytvoření indexu v poli namepoužijte následující příkaz:
db.coll.createIndex({name:1})
Na portálu Azure vytvořte stejný index name s jedním polem:
Dotaz používá více indexů jednoho pole, pokud je k dispozici. Vytvořte až 500 indexů jednoho pole na kolekci.
Složené indexy (server MongoDB verze 3.6+)
V rozhraní API pro MongoDB použijte složené indexy s dotazy, které seřadí více polí najednou. U dotazů s více filtry, které není potřeba řadit, vytvořte místo složeného indexu více indexů s jedním polem, abyste ušetřili náklady na indexování.
Složený index nebo indexy s jedním polem pro každé pole ve složeného indexu mají stejný výkon pro filtrování v dotazech.
Složené indexy v vnořených polí nejsou ve výchozím nastavení podporovány kvůli omezením polí. Pokud vnořené pole neobsahuje pole, funguje index podle očekávání. Pokud vnořené pole obsahuje v jakékoli části své cesty pole, tato hodnota bude v indexu ignorována.
Složený index obsahující people.dylan.age v tomto případě například funguje, protože v cestě není žádné pole:
{
"people": {
"dylan": {
"name": "Dylan",
"age": "25"
},
"reed": {
"name": "Reed",
"age": "30"
}
}
}
Stejný složený index v tomto případě nefunguje, protože v cestě je pole:
{
"people": [
{
"name": "Dylan",
"age": "25"
},
{
"name": "Reed",
"age": "30"
}
]
}
Tuto funkci pro účet databáze povolte povolením funkce EnableUniqueCompoundNestedDocs.
Note
Složené indexy nelze vytvářet v polích.
Následující příkaz vytvoří složený index polí name a age:
db.coll.createIndex({name:1,age:1})
Složené indexy můžete použít k efektivnímu řazení na více polích najednou, jak je znázorněno v následujícím příkladu:
db.coll.find().sort({name:1,age:1})
Předchozí složený index můžete také použít 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})
Posloupnost cest ve složeného 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})
Indexy s více klíči
Azure Cosmos DB vytváří víceklíčové indexy pro indexování obsahu v polích. Pokud indexujete pole s maticovou hodnotou, Azure Cosmos DB automaticky indexuje každý prvek v poli.
Geoprostorové indexy
Mnoho geoprostorových operátorů má prospěch z geoprostorových indexů. Azure Cosmos DB pro MongoDB podporuje 2dsphere indexy. Rozhraní API zatím nepodporuje 2d indexy.
Tady je příklad vytvoření geoprostorového indexu v location poli:
db.coll.createIndex({ location : "2dsphere" })
Textové indexy
Azure Cosmos DB pro MongoDB nepodporuje textové indexy. Pro dotazy na vyhledávání textu na řetězce použijte integraci azure AI Search se službou Azure Cosmos DB.
Indexy se zástupnými znaky
Pomocí indexů se zástupnými znamény můžete podporovat dotazy na neznámá pole. Představte si kolekci, která obsahuje data o rodinách.
Tady je část ukázkového dokumentu v této kolekci:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Tady je další příklad s jinou sadou vlastností v children:
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
Dokumenty v této kolekci můžou mít mnoho různých vlastností. Chcete-li indexovat všechna data v children poli, vytvořte samostatné indexy pro každou vlastnost nebo vytvořte jeden index se zástupnými výjimkou pro celé children pole.
Vytvořte index se zástupným znakem
Pomocí následujícího příkazu vytvořte index zástupných znaků pro všechny vlastnosti 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átech dotazů. Pokud použijete jeden index se zástupným znakem místo samostatného indexu pro každou vlastnost, není žádný rozdíl ve výkonu dotazů.
Pomocí syntaxe zástupných znaků vytvořte následující typy indexů:
- Jedno pole
- Geospatial
Indexování všech vlastností
Pomocí následujícího příkazu vytvořte index se zástupným znakem pro všechna pole:
db.coll.createIndex( { "$**" : 1 } )
Vytváření indexů se zástupnými znaky pomocí Průzkumníka dat na webu Azure Portal:
Note
Pokud teprve začínáte s vývojem, začněte s wildcard indexem na všech polích. Tento přístup zjednodušuje vývoj a usnadňuje optimalizaci dotazů.
Dokumenty s mnoha poli můžou mít vysoké poplatky za jednotku žádosti (RU) za zápisy a aktualizace. Pokud máte úlohu náročné na zápis, použijte místo zástupných znaků jednotlivé indexované cesty.
Omezení
Indexy se zástupnými čáry nepodporují žádný z následujících typů nebo vlastností indexu:
Compound
hodnota TTL
Jedinečný
Na rozdíl od MongoDB nemůžete ve službě 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 více indexů se zástupnými znaky.
Vlastnosti indexu
Následující operace jsou běžné pro účty, které používají protokol wire protocol verze 4.0 a starší verze. Přečtěte si další informace o podporovaných indexech a indexovaných vlastnostech.
Jedinečné indexy
Jedinečné indexy pomáhají zajistit, aby dva nebo více dokumentů nemělo stejnou hodnotu pro indexovaná pole.
Spuštěním následujícího příkazu vytvořte jedinečný index pole student_id :
db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
V případě horizontálně dělených kolekcí zadejte klíč dílu k vytvoření jedinečného indexu. Všechny jedinečné indexy v horizontálně dělené kolekci jsou složené indexy a jedním z polí je klíč horizontálního dělení. Štěpící klíč by měl být prvním polem v definici indexu.
Spuštěním následujících příkazů vytvořte horizontálně dělenou kolekci s názvem coll (s university klíčem horizontálního dělení) a jedinečný index pro pole student_id a university pole:
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
}
Pokud klauzuli "university":1 vynecháte v předchozím příkladu, zobrazí se následující chybová zpráva:
cannot create unique index over {student_id : 1.0} with shard key pattern { university : 1.0 }
Omezení
Vytvořte jedinečné indexy, zatímco kolekce je prázdná.
Účty Azure Cosmos DB pro MongoDB s průběžným zálohováním nepodporují vytvoření jedinečného indexu pro existující kolekci. Pro takový účet musí být jedinečné indexy vytvořeny společně s vytvořením jejich kolekce, což lze provést pouze pomocí příkazů pro vytvoření kolekce extension commands.
db.runCommand({customAction:"CreateCollection", collection:"coll", shardKey:"student_id", indexes:[
{key: { "student_id" : 1}, name:"student_id_1", unique: true}
]});
Jedinečné indexy v vnořených polí nejsou ve výchozím nastavení podporovány kvůli omezením polí. Pokud vaše vnořené pole neobsahuje pole, index funguje dle očekávání. Pokud vaše vnořené pole obsahuje pole kdekoli v rámci cesty, tato hodnota je ignorována v jedinečném indexu a pro tuto hodnotu není zachována jedinečnost.
V tomto případě například funguje jedinečný index people.tom.age , protože v cestě není žádné pole:
{
"people": {
"tom": {
"age": "25"
},
"mark": {
"age": "30"
}
}
}
V tomto případě ale nefunguje, protože v cestě je pole:
{
"people": {
"tom": [
{
"age": "25"
}
],
"mark": [
{
"age": "30"
}
]
}
}
Tuto funkci můžete pro svůj databázový účet povolit povolením funkce EnableUniqueCompoundNestedDocs.
Indexy TTL
Pokud chcete umožnit vypršení platnosti dokumentů v kolekci, vytvořte index TTL (Time to Live). Index TTL je index pole _ts s expireAfterSeconds hodnotou.
Příklad:
db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Předchozí příkaz odstraní všechny dokumenty v db.coll kolekci, které byly změněny před více než 10 sekundami.
Note
Pole _ts je specifické pro službu 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ší služby Azure Cosmos DB pro MongoDB podporuje currentOp() příkaz ke sledování průběhu indexu v instanci databáze. Tento příkaz vrátí dokument s informacemi o probíhajících operacích v instanci databáze.
currentOp Pomocí příkazu můžete sledovat všechny probíhající operace v nativní databázi MongoDB. Ve službě Azure Cosmos DB pro MongoDB tento příkaz sleduje pouze operaci indexu.
Tady je několik příkladů použití příkazu ke sledování průběhu indexu currentOp :
Získat průběh indexace pro kolekci
db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})Získání průběhu 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 služby Azure Cosmos DB:
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 jsou příklady formátu výstupního dokumentu pro různé fáze průběhu indexu:
Operace indexu na kolekci "foo" a databázi "bar", která je dokončena na 60 procent, má následující výstupní dokument. Pole
Inprog[0].progress.totalzobrazuje 100 jako procento dokončení cíle.{ "inprog": [ { ... "command": { "createIndexes": foo "indexes": [], "$db": bar }, "msg": "Index Build (background) Index Build (background): 60 %", "progress": { "done": 60, "total": 100 }, ... } ], "ok": 1 }Pokud operace indexu právě začala na kolekci "foo" a databázi "bar", výstupní dokument může zobrazovat 0 % průběhu, dokud nedosáhne 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í indexové operace se ve výstupním dokumentu zobrazí prázdné operace
inprog.{ "inprog" : [], "ok" : 1 }
Aktualizace indexu na pozadí
Aktualizace indexu se vždy spouští na pozadí bez ohledu na to, jakou hodnotu jste nastavili pro vlastnost Index pozadí . Vzhledem k tomu, že aktualizace indexu používají jednotky žádostí (RU) s nižší prioritou než jiné databázové akce, změny indexu nezpůsobí výpadky zápisů, aktualizací nebo odstranění.
Přidání nového indexu nemá vliv na dostupnost čtení. Dotazy používají nové indexy až po dokončení transformace indexu. Během transformace dotazovací modul nadále používá existující indexy, takže před zahájením změny indexování uvidíte podobný výkon čtení. Přidání nových indexů neohrožuje neúplné nebo nekonzistentní výsledky dotazu.
Pokud odeberete indexy a okamžitě spustíte dotazy, které filtrují tyto vyřazené indexy, mohou být výsledky nekonzistentní a neúplné, dokud se transformace indexu nedokončí. Dotazovací modul neposkytuje konzistentní ani kompletní výsledky pro dotazy, které filtrují nově odebrané indexy. Většina vývojářů indexy neodstraní a hned je nedotazují, takže tato situace je nepravděpodobná.
Note
Průběh indexu můžete sledovat.
reIndex příkaz
Příkaz reIndex znovu vytvoří všechny indexy v kolekci. Ve výjimečných případech může spuštění reIndex příkazu opravit výkon dotazů nebo jiné problémy s indexem v kolekci. Pokud dochází k problémům s indexováním, zkuste znovu vytvořit indexy pomocí reIndex příkazu.
reIndex Spusťte příkaz pomocí následující syntaxe:
db.runCommand({ reIndex: <collection> })
Pomocí následující syntaxe zkontrolujte, jestli spuštění reIndex příkazu zlepšuje 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 zlepšuje výkon dotazů, requiresReIndex je pravda. Pokud reIndex nezlepší výkon dotazů, tato vlastnost se vynechá.
Migrace kolekcí s využitím indexů
Jedinečné indexy můžete vytvořit pouze v případě, že kolekce neobsahuje žádné dokumenty. Oblíbené nástroje pro migraci MongoDB se po importu dat pokusí vytvořit jedinečné indexy. Chcete-li tento problém vyřešit, ručně vytvořte odpovídající kolekce a jedinečné indexy, místo aby se o to pokoušel nástroj pro migraci. Toto chování mongorestore dosáhnete použitím příznaku --noIndexRestore v příkazovém řádku.
Indexování pro MongoDB verze 3.2
Funkce indexování a výchozí hodnoty se liší u účtů služby Azure Cosmos DB, které používají verzi 3.2 přenosového protokolu MongoDB. Zkontrolujte verzi účtu na adrese feature-support-36.md#protocol-support a upgradujte na verzi 3.6 na upgrade-version.md.
Pokud používáte verzi 3.2, v této části jsou uvedeny hlavní rozdíly ve verzích 3.6 a novějších.
Vrácení výchozích indexů (verze 3.2)
Na rozdíl od verze 3.6 a novější indexuje Azure Cosmos DB pro MongoDB verze 3.2 ve výchozím nastavení všechny vlastnosti. Pomocí následujícího příkazu odstraňte tyto výchozí indexy pro kolekci (coll):
db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Po vyřazení výchozích indexů přidejte další indexy, jak to uděláte ve verzi 3.6 a novější.
Složené indexy (verze 3.2)
Složené indexy odkazují na více polí v dokumentu. Pokud chcete vytvořit složený index, upgradujte na verzi 3.6 nebo 4.0 v upgrade-version.md.
Indexy se zástupnými znaky (verze 3.2)
Pokud chcete vytvořit index se zástupným znakem, upgradujte na verzi 4.0 nebo 3.6 v upgrade-version.md.