Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az Azure Cosmos DB for MongoDB lehetővé teszi az indexelés használatát a lekérdezési teljesítmény felgyorsításához. Ez a cikk bemutatja, hogyan kezelheti és optimalizálhatja az indexeket a gyorsabb adatlekérés és a jobb hatékonyság érdekében.
A MongoDB-kiszolgáló 3.6-os és újabb verziójának indexelése
Az Azure Cosmos DB for MongoDB server 3.6+ verziója automatikusan indexeli a _id mezőt és a szegmenskulcsot (csak szegmenses gyűjteményekben). Az API a mező szegmenskulcsonkénti _id egyediségét kényszeríti ki.
A MongoDB API másként működik, mint az Azure Cosmos DB for NoSQL, amely alapértelmezés szerint az összes mezőt indexeli.
Indexelési szabályzat szerkesztése
Szerkessze indexelési szabályzatát az Adatkezelőben az Azure Portalon. Adjon hozzá egyetlen mezőt és helyettesítő indexet az Indexelési szabályzat szerkesztőjében az Adatkezelőben:
Feljegyzés
Összetett indexek nem hozhatók létre az Adatkezelő indexelési szabályzatszerkesztőjével.
Indextípusok
Egyetlen mező
Hozzon létre egy indexet egyetlen mezőn. Az egymezős index rendezési sorrendje nem számít. A következő paranccsal hozzon létre egy indexet a mezőben name:
db.coll.createIndex({name:1})
Hozza létre ugyanazt az egymezős indexet az Azure Portalon name :
A lekérdezések több egymezős indexet használnak, ahol elérhetőek. Gyűjteményenként legfeljebb 500 egymezős indexet hozhat létre.
Összetett indexek (MongoDB-kiszolgáló 3.6-os vagy újabb verziója)
A MongoDB API-ban használjon összetett indexeket olyan lekérdezésekkel, amelyek egyszerre több mezőt rendeznek. Több szűrővel rendelkező lekérdezések esetén, amelyeknek nincs szükség rendezésre, hozzon létre több egymezős indexet összetett index helyett az indexelési költségek megtakarításához.
Az összetett indexek vagy egymezős indexek az összetett index minden mezőjéhez ugyanazt a teljesítményt eredményezik a lekérdezések szűréséhez.
A beágyazott mezők összetett indexei alapértelmezés szerint nem támogatottak a tömbök korlátozásai miatt. Ha egy beágyazott mező nem rendelkezik tömbbel, az index a kívánt módon működik. Ha egy beágyazott mező az elérési úton bárhol rendelkezik tömbbel, az érték figyelmen kívül lesz hagyva az indexben.
Ebben az esetben például egy összetett index people.dylan.age működik, mert nincs tömb az elérési úton:
{
"people": {
"dylan": {
"name": "Dylan",
"age": "25"
},
"reed": {
"name": "Reed",
"age": "30"
}
}
}
Ez az összetett index ebben az esetben nem működik, mert egy tömb van az elérési úton:
{
"people": [
{
"name": "Dylan",
"age": "25"
},
{
"name": "Reed",
"age": "30"
}
]
}
Engedélyezze ezt a funkciót az adatbázisfiókhoz az "EnableUniqueCompoundNestedDocs" funkció engedélyezésével.
Feljegyzés
Tömbökben nem hozhat létre összetett indexeket.
A következő parancs létrehoz egy összetett indexet a mezőkön name , és age:
db.coll.createIndex({name:1,age:1})
Összetett indexek használatával egyszerre több mezőre is hatékonyan rendezhet, ahogy az alábbi példában is látható:
db.coll.find().sort({name:1,age:1})
Az előző összetett index használatával is hatékonyan rendezhet egy olyan lekérdezést, amelynek minden mezőn ellentétes rendezési sorrendje van. Íme egy példa:
db.coll.find().sort({name:-1,age:-1})
Az összetett indexben lévő elérési utak sorrendjének azonban pontosan meg kell egyeznie a lekérdezésével. Íme egy példa egy olyan lekérdezésre, amely további összetett indexet igényel:
db.coll.find().sort({age:1,name:1})
Többkulcsos indexek
Az Azure Cosmos DB többkulcsos indexeket hoz létre a tömbök tartalmának indexeléséhez. Ha egy tömbértékkel rendelkező mezőt indexel, az Azure Cosmos DB automatikusan indexeli a tömb minden elemét.
Térinformatikai indexek
Számos térinformatikai operátor élvezi a térinformatikai indexek előnyeit. Az Azure Cosmos DB for MongoDB támogatja 2dsphere az indexeket. Az API még nem támogatja 2d az indexeket.
Íme egy példa a mező térinformatikai indexének location létrehozására:
db.coll.createIndex({ location : "2dsphere" })
Szövegindexek
A MongoDB-hez készült Azure Cosmos DB nem támogatja a szöveges indexeket. Sztringekre vonatkozó szöveges keresési lekérdezésekhez használja az Azure AI Search és az Azure Cosmos DB integrációját.
Joker karakterek indexei
Használjon helyettesítő indexeket az ismeretlen mezőkkel kapcsolatos lekérdezések támogatásához. Képzeljen el egy olyan gyűjteményt, amely családokkal kapcsolatos adatokat is tartalmazó gyűjtemény.
Íme egy példadokumentum a gyűjteményben:
"children": [
{
"firstName": "Henriette Thaulow",
"grade": "5"
}
]
Íme egy másik példa a következő tulajdonságok childrenkülönböző halmazával:
"children": [
{
"familyName": "Merriam",
"givenName": "Jesse",
"pets": [
{ "givenName": "Goofy" },
{ "givenName": "Shadow" }
]
},
{
"familyName": "Merriam",
"givenName": "John",
}
]
A gyűjtemény dokumentumai számos különböző tulajdonsággal rendelkezhetnek. A tömb összes adatának children indexeléséhez hozzon létre külön indexeket minden tulajdonsághoz, vagy hozzon létre egy helyettesítő indexet a teljes children tömbhöz.
Helyettesítő karakterek indexének létrehozása
A következő paranccsal helyettesítő indexet hozhat létre a következő tulajdonságokon belül children:
db.coll.createIndex({"children.$**" : 1})
- A MongoDB-vel ellentétben a helyettesítő karakterek indexei több mezőt is támogatnak a lekérdezési predikátumokban. Nincs különbség a lekérdezési teljesítményben, ha egyetlen helyettesítő indexet használ ahelyett, hogy minden tulajdonsághoz külön indexet hoz létre.
A következő indextípusok létrehozása helyettesítő karakterek szintaxisával:
- Egyetlen mező
- Térinformatikai
Az összes tulajdonság indexelése
Hozzon létre egy helyettesítő indexet az összes mezőn a következő paranccsal:
db.coll.createIndex( { "$**" : 1 } )
Helyettesítő karakterek indexeinek létrehozása az Adatkezelővel az Azure Portalon:
Feljegyzés
Ha csak most kezdi el a fejlesztést, kezdjen egy helyettesítő indexkel az összes mezőn. Ez a megközelítés leegyszerűsíti a fejlesztést, és megkönnyíti a lekérdezések optimalizálását.
A sok mezőt tartalmazó dokumentumok írási és frissítési díja magas kérelemegység(RU) lehet. Ha írási nehéz számítási feladatokkal rendelkezik, használjon egyéni indexelt útvonalakat helyettesítő karakterek helyett.
Korlátozások
A helyettesítő karakterek indexei nem támogatják az alábbi indextípusokat vagy tulajdonságokat:
Összetett
élettartam
Egyedi
A MongoDB-vel ellentétben a MongoDB-hez készült Azure Cosmos DB-ben nem használhat helyettesítő indexeket a következőhöz:
Több megadott mezőt tartalmazó helyettesítő index létrehozása
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection " : { "children.givenName" : 1, "children.grade" : 1 } } )Több megadott mezőt nem tartalmazó helyettesítő index létrehozása
db.coll.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "children.givenName" : 0, "children.grade" : 0 } } )
Alternatív megoldásként hozzon létre több helyettesítő indexet.
Indextulajdonságok
A wire protocol 4.0-s és korábbi verzióit használó fiókok esetében az alábbi műveletek gyakoriak. További információ a támogatott indexekről és az indexelt tulajdonságokról.
Egyedi indexek
Az egyedi indexek segítenek meggyőződni arról, hogy két vagy több dokumentum nem rendelkezik azonos értékkel az indexelt mezők esetében.
Futtassa a következő parancsot egy egyedi index létrehozásához a student_id mezőben:
db.coll.createIndex( { "student_id" : 1 }, {unique:true} )
{
"_t" : "CreateIndexesResponse",
"ok" : 1,
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 4
}
Szegmenses gyűjtemények esetén adja meg a szegmens (partíció) kulcsot egy egyedi index létrehozásához. A szegmenses gyűjtemények összes egyedi indexe összetett index, és az egyik mező a szegmenskulcs. A szegmenskulcsnak az indexdefiníció első mezőjének kell lennie.
Futtassa a következő parancsokat egy szegmenses gyűjtemény coll létrehozásához (szegmenskulcsként) university és egy egyedi index létrehozásához a student_id mezőkön:university
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
}
Ha kihagyja az "university":1 előző példában szereplő záradékot, a következő hibaüzenet jelenik meg:
cannot create unique index over {student_id : 1.0} with shard key pattern { university : 1.0 }
Korlátozások
Hozzon létre egyedi indexeket, amíg a gyűjtemény üres.
A MongoDB-hez készült Azure Cosmos DB-fiókok folyamatos biztonsági mentéssel nem támogatják egy meglévő gyűjtemény egyedi indexének létrehozását. Ilyen fiók esetén egyedi indexeket kell létrehozni a gyűjtemény létrehozásával együtt, amelyeket csak a gyűjteménybővítmény-parancsok létrehozásával lehet elvégezni.
db.runCommand({customAction:"CreateCollection", collection:"coll", shardKey:"student_id", indexes:[
{key: { "student_id" : 1}, name:"student_id_1", unique: true}
]});
A beágyazott mezők egyedi indexei alapértelmezés szerint nem támogatottak a tömbök korlátozásai miatt. Ha a beágyazott mező nem rendelkezik tömbbel, az index a kívánt módon működik. Ha a beágyazott mező az elérési úton bárhol rendelkezik tömbbel, a rendszer figyelmen kívül hagyja ezt az értéket az egyedi indexben, és az egyediség nem marad meg az adott értéknél.
Ebben az esetben például egy egyedi index people.tom.age működik, mert nincs tömb az elérési úton:
{
"people": {
"tom": {
"age": "25"
},
"mark": {
"age": "30"
}
}
}
Ebben az esetben azonban nem működik, mert egy tömb van az elérési úton:
{
"people": {
"tom": [
{
"age": "25"
}
],
"mark": [
{
"age": "30"
}
]
}
}
Ez a funkció az "EnableUniqueCompoundNestedDocs" funkció engedélyezésével engedélyezhető az adatbázisfiók számára.
TTL-indexek
Ha azt szeretné, hogy a dokumentumok lejárjanak egy gyűjteményben, hozzon létre egy élettartam-indexet (TTL). A TTL-index egy index a _ts mezőn, amely egy expireAfterSeconds értéket tartalmaz.
Példa:
db.coll.createIndex({"_ts":1}, {expireAfterSeconds: 10})
Az előző parancs törli a db.coll gyűjtemény 10 másodpercnél régebbi módosításait.
Feljegyzés
A _ts mező az Azure Cosmos DB-hez tartozik, és nem érhető el a MongoDB-ügyfelekről. Ez egy fenntartott (rendszer)tulajdonság, amely a dokumentum utolsó módosításának időbélyegét tartalmazza.
Index állapotának nyomon követése
A MongoDB-hez készült Azure Cosmos DB 3.6+-os verziója támogatja az currentOp() adatbázispéldányok indexállapotának nyomon követésére szolgáló parancsot. Ez a parancs egy adatbázispéldány folyamatban lévő műveleteire vonatkozó információkat tartalmazó dokumentumot ad vissza. A parancs segítségével nyomon követheti az currentOp összes folyamatban lévő műveletet a natív MongoDB-ben. A MongoDB-hez készült Azure Cosmos DB-ben ez a parancs csak az indexelési műveletet követi nyomon.
Íme néhány példa arra, hogyan használhatja a parancsot az currentOp index előrehaladásának nyomon követésére:
Gyűjtemény indexállapotának lekérése:
db.currentOp({"command.createIndexes": <collectionName>, "command.$db": <databaseName>})Indexállapot lekérése az adatbázis összes gyűjteményéhez:
db.currentOp({"command.$db": <databaseName>})Indexállapot lekérése egy Azure Cosmos DB-fiók összes adatbázisához és gyűjteményéhez:
db.currentOp({"command.createIndexes": { $exists : true } })
Példák az index előrehaladás kimenetére
Az index előrehaladásának részletei az aktuális indexművelet előrehaladásának százalékos arányát mutatják. Íme néhány példa a kimeneti dokumentum formátumára az index előrehaladásának különböző szakaszaihoz:
A "foo" gyűjtemény és a "sáv" adatbázis 60%-os készültségi szinttel rendelkező indexművelete a következő kimeneti dokumentumot tartalmazza. A
Inprog[0].progress.totalmező a 100-as értéket jeleníti meg a cél befejezési százalékában.{ "inprog": [ { ... "command": { "createIndexes": foo "indexes": [], "$db": bar }, "msg": "Index Build (background) Index Build (background): 60 %", "progress": { "done": 60, "total": 100 }, ... } ], "ok": 1 }Ha egy indexművelet éppen most kezdődött egy "foo" gyűjteményen és egy sávos adatbázisban, a kimeneti dokumentum 0 százalékos előrehaladást jeleníthet meg, amíg el nem éri a mérhető szintet.
{ "inprog": [ { ... "command": { "createIndexes": foo "indexes": [], "$db": bar }, "msg": "Index Build (background) Index Build (background): 0 %", "progress": { "done": 0, "total": 100 }, ... } ], "ok": 1 }Amikor az indexművelet befejeződik, a kimeneti dokumentum üres
inprogműveleteket jelenít meg.{ "inprog" : [], "ok" : 1 }
Háttérindex frissítései
Az indexfrissítések mindig a háttérben futnak, függetlenül attól, hogy milyen értéket állított be a Háttér index tulajdonsághoz. Mivel az indexfrissítések a kérelemegységeket (kérelemegységeket) a többi adatbázisműveletnél alacsonyabb prioritással használják, az indexmódosítások nem okoznak állásidőt az írásokhoz, frissítésekhez és törlésekhez.
Az új index hozzáadása nem befolyásolja az olvasási rendelkezésre állást. A lekérdezések csak az indexátalakítás befejeződése után használnak új indexeket. Az átalakítás során a lekérdezési motor továbbra is meglévő indexeket használ, így hasonló olvasási teljesítmény jelenik meg, mint az indexelés módosítása előtt. Az új indexek hozzáadása nem kockáztatja a hiányos vagy inkonzisztens lekérdezési eredményeket.
Ha eltávolítja az indexeket, és azonnal futtat olyan lekérdezéseket, amelyek az elvetett indexekre szűrnek, az eredmények inkonzisztensek és hiányosak lehetnek az indexátalakítás befejezéséig. A lekérdezési motor nem biztosít konzisztens vagy teljes eredményeket az újonnan eltávolított indexekre szűrő lekérdezésekhez. A fejlesztők többsége nem ejti le az indexeket, majd azonnal lekérdezi őket, így ez a helyzet nem valószínű.
Feljegyzés
Nyomon követheti az index előrehaladását.
reIndex parancs
A reIndex parancs újra létrehozza a gyűjtemény összes indexét. Ritkán a parancs futtatása javíthatja a reIndex lekérdezési teljesítményt vagy a gyűjtemény egyéb indexelési problémáit. Ha indexelési problémákat tapasztal, próbálkozzon újra az indexekkel a reIndex paranccsal.
Futtassa a reIndex parancsot a következő szintaxissal:
db.runCommand({ reIndex: <collection> })
Az alábbi szintaxis segítségével ellenőrizze, hogy a parancs futtatása javítja-e a reIndex lekérdezési teljesítményt a gyűjteményben:
db.runCommand({"customAction":"GetCollection",collection:<collection>, showIndexes:true})
Példa a kimenetre:
{
"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
}
Ha reIndex javítja a lekérdezési teljesítményt, a SzükségreIndex értéke igaz. Ha reIndex nem javít a lekérdezési teljesítményen, a tulajdonság nem lesz kihagyva.
Gyűjtemények migrálása indexekkel
Csak akkor hozhat létre egyedi indexeket, ha a gyűjtemény nem rendelkezik dokumentumokkal. A népszerű MongoDB migrálási eszközök az adatok importálása után megpróbálnak egyedi indexeket létrehozni. A probléma megoldásához manuálisan hozza létre a megfelelő gyűjteményeket és egyedi indexeket ahelyett, hogy lehetővé teszi az áttelepítési eszköz kipróbálását. Ezt a viselkedést mongorestore a parancssorban lévő --noIndexRestore jelölő használatával érheti el.
Indexelés a MongoDB 3.2-es verziójához
Az indexelési funkciók és az alapértelmezett értékek eltérnek a MongoDB wire protokoll 3.2-es verzióját használó Azure Cosmos DB-fiókoktól. Ellenőrizze a fiók verzióját a feature-support-36.md#protocol-support címen, és frissítsen a 3.6-os verzióra a upgrade-version.md.
Ha a 3.2-es verziót használja, ez a szakasz a 3.6-os és újabb verziók főbb különbségeit emeli ki.
Alapértelmezett indexek elvetése (3.2-es verzió)
A 3.6-os és újabb verzióktól eltérően az Azure Cosmos DB for MongoDB 3.2-es verziója alapértelmezés szerint indexel minden tulajdonságot. Az alábbi paranccsal elveti ezeket az alapértelmezett indexeket egy gyűjteményhez (coll):
db.coll.dropIndexes()
{ "_t" : "DropIndexesResponse", "ok" : 1, "nIndexesWas" : 3 }
Az alapértelmezett indexek elvetése után adjon hozzá további indexeket a 3.6-os és újabb verzióhoz hasonlóan.
Összetett indexek (3.2-es verzió)
Az összetett indexek egy dokumentum több mezőjére hivatkoznak. Összetett index létrehozásához frissítsen a 3.6-os vagy 4.0-s verzióra a upgrade-version.md.
Joker indexek (3.2-es verzió)
Helyettesítő karakterek indexének létrehozásához frissítsen a 4.0-s vagy 3.6-os verzióra a upgrade-version.md.