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.
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 na klíč horizontálního _id oddílu.
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 jedno pole a indexy se zástupnými kódy v Průzkumníku dat:
Poznámka:
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 webu Azure Portal 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 pole neobsahuje pole, funguje index podle očekávání. Pokud má vnořené pole pole kdekoli na cestě, bude tato hodnota 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.
Poznámka:
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 místo vytvoření samostatného indexu pro každou vlastnost použijete jeden index se zástupnými výjimkou, není žádný rozdíl v výkonu dotazů.
Pomocí syntaxe zástupných znaků vytvořte následující typy indexů:
- Jedno pole
- Geoprostorové
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:
Poznámka:
Pokud teprve začínáte vyvíjet, začněte indexem zástupných znaků ve 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:
Sloučenina
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íč horizontálního oddílu (oddílu) pro 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í. Klíč horizontálního oddílu 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 pole neobsahuje pole, funguje index podle očekávání. Pokud má vaše vnořené pole pole kdekoli na cestě, bude tato hodnota ignorována v jedinečném indexu a jedinečnost pro tuto hodnotu se nezachová.
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.
Poznámka:
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ískání průběhu indexu 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 v kolekci "foo" a "bar" databázi, která je dokončena 60 procent, obsahuje 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 v kolekci "foo" a "pruhové" databázi, může výstupní dokument zobrazit 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í operace indexu se ve výstupním dokumentu zobrazí prázdné
inprogoperace.{ "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 se na ně dotazuje, takže tato situace je nepravděpodobné.
Poznámka:
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 se zvýší výkon dotazů, vyžaduje hodnotu True. 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 toho, aby nástroj pro migraci zkusil. 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.