Bland uppgifterna som är involverade i databashantering är att förbättra prestanda genom att använda olika strategier. Indexering är ett av tipsen som förbättrar genomströmningsoperationer genom att underlätta dataåtkomst till frågeförfrågningar. Det gör det genom att minimera antalet diskåtkomst som krävs när en fråga bearbetas. Underlåtenhet att använda index i MongoDB kommer att tvinga databasen att utföra en fullständig samlingsskanning, det vill säga skanna igenom alla dokument i samlingen för att välja dokument som matchar en utfärdad frågesats. Uppenbarligen kommer detta att ta mycket tid, särskilt om det finns så många dokument inblandade. I ett nötskal, index stöder effektiv exekvering av frågor.
MongoDB-index
Eftersom vi förväntar oss att lagra många dokument i en MongoDB-samling, måste vi hitta ett sätt att lagra en liten del av data för varje dokument i en annan partition för enkel genomgång med hjälp av index. Ett index kommer att lagra ett eller flera specifika fältvärden och sedan sortera dessa data i ordning efter värdet för det fältet. Med denna beställning stöds effektiv frågematchning och intervallbaserade frågeoperationer. Index definieras på samlingsnivå och de stöds av alla fält eller inbäddade fält i dokumenten i samlingen.
När du skapar ett dokument tilldelar MongoDB som standard ett _id-fält om det inte anges och gör detta till ett unikt index för det dokumentet. I grund och botten är detta för att förhindra att samma dokument infogas fler än ettor i den samlingen. Dessutom, för ett fragmenterat kluster, är det tillrådligt att använda detta _id-fält som en del av shard-nycklarna, annars måste det finnas en viss unikhet hos data i _id-fältet för att undvika fel.
Skapa ett index för en samling
Förutsatt att du har infogat några data i din samling och du vill tilldela ett fält som ett index, kan du använda metoden createIndex för att uppnå detta, dvs.
Låt oss säga att du har denna json-data:
{
_id:1,
Name: “Sepp Maier”,
Country: “Germany”
}
Vi kan göra fältet Namn till ett fallande index genom att:
db.collection.createIndex({Name: -1})
Denna metod skapar ett index med samma specifikation om det bara inte redan finns.
Typer av index i MongoDB
MongoDB involverar olika typer av data och därför härleds olika typer av index för att stödja dessa datatyper och frågor.
-
Enstaka fält
Genom att använda ett enda fält i ett dokument kan man göra fältet till ett index på ett stigande eller fallande sätt precis som exemplet ovan. Dessutom kan du skapa ett index på ett inbäddat dokument som helhet, till exempel:
{ _id: “xyz”, Contact:{ email: “[email protected]”, phone:”+420 78342823” }, Name: “Sergio” }
Kontaktfält är ett inbäddat dokument, så vi kan göra det till ett stigande index med kommandot:
db.collection.createIndex({ Contact: 1})
I en fråga kan vi hämta dokumentet som:
db.collection.find({ Contact: {email: “[email protected]”, phone:”+420 78342823”} })
En bästa praxis är att skapa indexet i bakgrunden, särskilt när en stor mängd data är inblandad eftersom applikationen behöver komma åt data medan indexet byggs upp.
-
Sammansatt index
Sammansatta index används ofta för att underlätta sorteringsoperationen inom en fråga och stödja frågor som matchar flera fält. Syntaxen för att skapa ett sammansatt index är:
db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )
Skapa ett sammansatt index för exempeldata nedan
{ _id: “1”, Name: “Tom”, Age: 24, Score:”80” } db.collection.createIndex({ Age: 1, Score:-1})
Överväganden:
- En gräns på endast 32 fält kan stödjas.
- Fältets värde kommer att definiera typen av index, dvs. 1 är stigande och -1 är fallande.
- Skapa inte sammansatta index som har hashad indextyp.
- Ordningen av fälten i ett sammansatt index är viktig. Sorteringen kommer att göras i enlighet med fältens ordning.
-
Multikey Index
Vid något tillfälle kan du ha fält med lagrat arrayinnehåll. När dessa fält indexeras skapas separata indexposter för varje element. Det hjälper därför en fråga att välja dokument som består av arrayer genom att matcha på element eller element i arrayerna. Detta görs automatiskt av MongoDB och behöver därför inte explicit specificera multikey-typen. Från version 3.4 spårar MongoDB vilka indexerade fält som gör att ett index blir ett flernyckelindex. Med denna spårning tillåts databasfrågemotorn använda snävare indexgränser.
Begränsningar för Multikey Index
- Endast ett matrisfält kan användas i multikey-indexeringen för ett dokument i samlingen. d.v.s. Du kan inte skapa ett flernyckelindex för kommandot och data nedan
Du kan inte skapa ett flernyckelindex{ _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
{ nums: 1, scores: 1 }
- Om multikey-indexet redan finns kan du inte infoga ett dokument som bryter mot denna begränsning. Det vill säga om vi har
Efter att ha skapat ett sammansatt flernyckelindex, ett försök att infoga ett dokument där både numer och poängfält är matriser, kommer databasen att misslyckas med infogningen.{ _id: 1, nums: 1, scores: [ 30, 60 ]} { _id: 1, nums: [ 1, 2 ], scores: 30}
- Endast ett matrisfält kan användas i multikey-indexeringen för ett dokument i samlingen. d.v.s. Du kan inte skapa ett flernyckelindex för kommandot och data nedan
-
Textindex
Textindex används ofta för att förbättra sökfrågor för en sträng i en samling. De lagrar inte språkspecifika stoppord (d.v.s. "det", "ett", "eller"). En samling kan ha högst ett textindex. Så här skapar du ett textindex:
db.collection.createIndex({Name:”text”})
Du kan också indexera flera fält, dvs.
db.collection.createIndex({ Name:”text”, place:”text” })
Ett sammansatt index kan innehålla en textindexnyckel i kombination med den stigande/fallande indexnyckeln men:
- Alla textindexnycklar måste finnas bredvid i indexspecifikationsdokumentet när du skapar ett sammansatt textindex.
- Inga andra speciella indextyper som t.ex. indexfält med flera nyckel bör ingå i det sammansatta textindexet.
- För att utföra en $text-sökning måste frågepredikatet inkludera likhetsmatchningsvillkor på de föregående nycklarna.
-
Hashade index
Sharding är en av teknikerna som används i MongoDB för att förbättra horisontell skalning. Sharing involverar ofta ett hashbaserat koncept genom användning av hashade index. Den mer slumpmässiga fördelningen av värden längs deras intervall skildras av dessa index, men stöder bara likhetsmatchningar och kan inte stödja intervallbaserade frågor.
Övergripande operativa överväganden för index
- Varje index kräver minst 8 kB datautrymme.
- När det är aktivt kommer varje index att förbruka lite diskutrymme och minne. Detta är viktigt när det spåras i kapacitetsplanering.
- För en samling med högt läs-till-skriv-förhållande förbättrar ytterligare index prestandan och påverkar inte oindexerade läsoperationer.
Begränsningar för att använda index
- Att lägga till ett index har en viss negativ inverkan på prestanda för skrivoperationer, särskilt för samlingar med högt skriv-till-läs-förhållande. Index blir dyra eftersom varje inlägg också måste uppdatera vilket index som helst.
- MongoDB kommer inte att skapa, uppdatera ett index eller infoga i en indexerad samling om indexposten för ett befintligt dokument överskrider indexnyckelgränsen.
- För befintliga fragmenterade samlingar misslyckas chunkmigreringen om chunken har ett dokument som innehåller ett indexerat fält som har en indexpost som överskrider indexnyckelgränsen.
Slutsats
Det finns så många sätt att förbättra MongoDB-prestanda, indexering är ett av dem. Indexering underlättar frågeoperationer genom att minska fördröjningen över vilken data hämtas genom att på något sätt minimera antalet dokument som behöver skannas. Det finns dock några överväganden man måste göra innan man bestämmer sig för att använda en specifik typ av index. Samlingar med hög läs-till-skriv-kvot tenderar att använda index bättre än samlingar med höga skriv-till-läs-operationer.