Metodtips för indexering i Azure Cosmos DB för MongoDB vCore
GÄLLER FÖR: MongoDB vCore
Frågebara fält bör alltid ha index skapade
Läsåtgärder baserade på predikat och aggregeringar läser indexet för motsvarande filter. I avsaknad av index utför databasmotorn en dokumentgenomsökning för att hämta matchande dokument. Genomsökningar är alltid dyra och blir allt dyrare när mängden data i en samling växer. För optimal frågeprestanda bör index alltid skapas för alla frågebara fält.
Undvik onödiga index och indexering av alla fält som standard
Index ska endast skapas för frågebara fält. Jokerteckenindexering bör endast användas när frågemönster är oförutsägbara där alla fält i dokumentstrukturen kan ingå i frågefilter.
Dricks
Azure Cosmos DB for MongoDB vCore indexerar endast fältet _id som standard. Alla andra fält indexeras inte som standard. De fält som ska indexeras bör planeras i förväg för att maximera frågeprestanda, samtidigt som påverkan på skrivningar från indexering av för många fält minimeras.
När ett nytt dokument infogas för första gången eller ett befintligt dokument uppdateras eller tas bort uppdateras även vart och ett av de angivna fälten i indexet. Om indexeringsprincipen innehåller ett stort antal fält (eller alla fält i dokumentet) förbrukas fler resurser av servern när motsvarande index uppdateras. När du kör i stor skala bör endast de frågebara fälten indexeras medan alla återstående fält som inte används i frågepredikat ska förbli undantagna från indexet.
Skapa nödvändiga index före datainmatning
För optimala prestanda bör index skapas i förväg innan data läses in. Alla dokumentskrivningar, uppdateringar och borttagningar uppdaterar synkront motsvarande index. Om index skapas när data har matats in förbrukas fler serverresurser för indexering av historiska data. Beroende på storleken på historiska data är den här åtgärden tidskrävande och påverkar prestanda för läsning och skrivning i stabilt tillstånd.
Kommentar
För scenarier där läsmönster ändras och index måste läggas till bör bakgrundsindexering aktiveras, vilket kan göras via en supportbegäran.
För flera index som skapats för historiska data kan du utfärda icke-blockering av createIndex-kommandon för varje fält
Det går inte alltid att planera för alla frågemönster i förväg, särskilt när programkraven utvecklas. Att ändra programbehov kräver oundvikligen att fält läggs till i indexet i ett kluster med en stor mängd historiska data.
I sådana scenarier bör varje createIndex-kommando utfärdas asynkront utan att vänta på ett svar från servern.
Kommentar
Som standard svarar Azure Cosmos DB for MongoDB vCore på en createIndex-åtgärd först när indexet är helt byggt på historiska data. Beroende på klustrets storlek och mängden data som matas in kan det ta tid och visas som om servern inte svarar på kommandot createIndex.
Om createIndex-kommandona utfärdas via Mongo Shell använder du Ctrl + C för att avbryta kommandot för att sluta vänta på ett svar och utfärda nästa uppsättning åtgärder.
Kommentar
Om du använder Ctrl + C för att avbryta kommandot createIndex när det har utfärdats avslutas inte indexgenereringsåtgärden på servern. Det hindrar helt enkelt gränssnittet från att vänta på ett svar från servern, medan servern asynkront fortsätter att skapa indexet över de befintliga dokumenten.
Skapa sammansatta index för frågor med predikat i flera fält
Sammansatta index bör användas i följande scenarier:
- Frågor med filter i flera fält
- Frågor med filter på flera fält och med ett eller flera fält sorterade i stigande eller fallande ordning
Överväg följande dokument i databasen "cosmicworks" och "employee"-samlingen
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"subDivision": "Data & AI",
"timeInOrgInYears": 7
}
Överväg följande fråga för att hitta alla anställda med efternamnet "Smith" med organisationen i mer än 5 år:
db.employee.find({"lastName": "Smith", "timeInOrgInYears": {"$gt": 5}})
Ett sammansatt index på både "lastName" och "timeInOrgInYears" optimerar den här frågan:
use cosmicworks;
db.employee.createIndex({"lastName" : 1, "timeInOrgInYears" : 1})
Spåra status för en createIndex-åtgärd
När index läggs till och historiska data måste indexeras, kan förloppet för indexet bygga åtgärden spåras med hjälp av db.currentOp().
Överväg det här exemplet för att spåra indexeringsstatusen för databasen "cosmicworks".
use cosmicworks;
db.currentOp()
När en createIndex-åtgärd pågår ser svaret ut så här:
{
"inprog": [
{
"shard": "defaultShard",
"active": true,
"type": "op",
"opid": "30000451493:1719209762286363",
"op_prefix": 30000451493,
"currentOpTime": "2024-06-24T06:16:02.000Z",
"secs_running": 0,
"command": { "aggregate": "" },
"op": "command",
"waitingForLock": false
},
{
"shard": "defaultShard",
"active": true,
"type": "op",
"opid": "30000451876:1719209638351743",
"op_prefix": 30000451876,
"currentOpTime": "2024-06-24T06:13:58.000Z",
"secs_running": 124,
"command": { "createIndexes": "" },
"op": "workerCommand",
"waitingForLock": false,
"progress": {},
"msg": ""
}
],
"ok": 1
}
Aktivera stora indexnycklar som standard
Även om dokumenten inte innehåller nycklar som har ett stort antal tecken eller om dokumenten inte innehåller flera kapslingsnivåer, säkerställer du att de här scenarierna omfattas genom att ange stora indexnycklar.
Överväg att använda den här sampen för att aktivera stora indexnycklar i samlingen "large_index_coll" i databasen "cosmicworks".
use cosmicworks;
db.runCommand(
{
"createIndexes": "large_index_coll",
"indexes": [
{
"key": { "ikey": 1 },
"name": "ikey_1",
"enableLargeIndexKeys": true
}
]
})
Prioritera indexversioner framför nya skrivåtgärder med hjälp av blockeringsalternativet
För scenarier där indexet ska skapas innan data läses in bör blockeringsalternativet användas för att blockera inkommande skrivningar tills indexet har skapats.
Inställningen { "blocking": true }
är särskilt användbar i migreringsverktyg där index skapas i tomma samlingar innan dataskrivningar påbörjas.
Överväg ett exempel på blockeringsalternativet för att skapa index i samlingen "medarbetare" i databasen "cosmicworks":
use cosmicworks;
db.runCommand({
createIndexes: "employee",
indexes: [{"key":{"name":1}, "name":"name_1"}],
blocking: true
})
Relaterat innehåll
Kolla in textindexering, vilket möjliggör effektiv sökning och frågekörning av textbaserade data.