Een van de taken die betrokken zijn bij databasebeheer is het verbeteren van de prestaties door verschillende strategieën te gebruiken. Indexering is een van de tips die doorvoerbewerkingen verbeteren door gegevenstoegang tot queryverzoeken te vergemakkelijken. Dit wordt gedaan door het aantal benodigde schijftoegang te minimaliseren wanneer een query wordt verwerkt. Het niet gebruiken van indexen in MongoDB zal de database dwingen een volledige collectiescan uit te voeren, dat wil zeggen, door alle documenten in de collectie te scannen om documenten te selecteren die overeenkomen met een afgegeven query-instructie. Uiteraard kost dit veel tijd, vooral als er zoveel documenten bij komen kijken. In een notendop, indexen ondersteunen een efficiënte uitvoering van zoekopdrachten.
MongoDB-indexen
Omdat we verwachten veel documenten in een MongoDB-verzameling op te slaan, moeten we een manier vinden om een klein deel van de gegevens voor elk document op een andere partitie op te slaan, zodat we er gemakkelijk doorheen kunnen bladeren met behulp van indexen. Een index slaat een specifieke veldwaarde of velden op en sorteert deze gegevens vervolgens in volgorde van de waarde van dat veld. Met deze volgorde worden efficiënte zoekopdrachten en op bereik gebaseerde zoekopdrachten ondersteund. Indexen worden gedefinieerd op collectieniveau en worden ondersteund door elk veld of ingesloten veld van de documenten in de collectie.
Wanneer u een document aanmaakt, wijst MongoDB standaard een _id-veld toe als dit niet is opgegeven en maakt dit een unieke index voor dat document. Dit is in principe bedoeld om te voorkomen dat hetzelfde document meer dan één document in die verzameling invoegt. Bovendien is het voor een shard-cluster raadzaam om dit _id-veld te gebruiken als onderdeel van de selectie van de shardsleutels, anders moeten de gegevens uniek zijn in het _id-veld om fouten te voorkomen.
Een index maken voor een verzameling
Ervan uitgaande dat u enkele gegevens in uw verzameling hebt ingevoegd en u wilt een veld als index toewijzen, kunt u de methode createIndex gebruiken om dit te bereiken, d.w.z.
Stel dat u deze json-gegevens heeft:
{
_id:1,
Name: “Sepp Maier”,
Country: “Germany”
}
We kunnen van het veld Naam een aflopende index maken door:
db.collection.createIndex({Name: -1})
Deze methode creëert een index met dezelfde specificatie als deze al niet bestaat.
Soorten indexen in MongoDB
MongoDB omvat verschillende soorten gegevens en daarom worden verschillende soorten indexen afgeleid om deze gegevenstypen en zoekopdrachten te ondersteunen.
-
Enkel veld
Met behulp van een enkel veld van een document kan men van het veld een index maken op een oplopende of aflopende manier, net als in het bovenstaande voorbeeld. Bovendien kunt u een index maken op een ingesloten document als geheel, bijvoorbeeld:
{ _id: “xyz”, Contact:{ email: “[email protected]”, phone:”+420 78342823” }, Name: “Sergio” }
Het veld Contact is een ingesloten document, daarom kunnen we er een oplopende index van maken met het commando:
db.collection.createIndex({ Contact: 1})
In een query kunnen we het document ophalen als:
db.collection.find({ Contact: {email: “[email protected]”, phone:”+420 78342823”} })
Een best practice is het maken van de index op de achtergrond, vooral wanneer het om een grote hoeveelheid gegevens gaat, aangezien de toepassing toegang moet hebben tot de gegevens tijdens het bouwen van de index.
-
Samengestelde index
Samengestelde indexen worden vaak gebruikt om de sorteerbewerking binnen een query te vergemakkelijken en om query's te ondersteunen die op meerdere velden overeenkomen. De syntaxis voor het maken van een samengestelde index is:
db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )
Een samengestelde index maken voor de onderstaande voorbeeldgegevens
{ _id: “1”, Name: “Tom”, Age: 24, Score:”80” } db.collection.createIndex({ Age: 1, Score:-1})
Overwegingen:
- Een limiet van slechts 32 velden kan worden ondersteund.
- De waarde van het veld bepaalt het type index, d.w.z. 1 is oplopend en -1 is aflopend.
- Maak geen samengestelde indexen met een gehasht indextype.
- De volgorde van de velden in een samengestelde index is belangrijk. Het sorteren gebeurt in overeenstemming met de volgorde van de velden.
-
Multikey-index
Op een bepaald moment hebt u mogelijk velden met opgeslagen array-inhoud. Wanneer deze velden worden geïndexeerd, worden voor elk element afzonderlijke indexitems gemaakt. Het helpt daarom een query om documenten te selecteren die uit arrays bestaan door te matchen op element of elementen van de arrays. Dit wordt automatisch gedaan door MongoDB, dus het is niet nodig om het multikey-type expliciet op te geven. Vanaf versie 3.4 houdt MongoDB bij welke geïndexeerde velden ervoor zorgen dat een index een index met meerdere toetsen is. Met deze tracking mag de databasequery-engine strakkere indexgrenzen gebruiken.
Beperkingen van Multikey Index
- Er kan slechts één matrixveld worden gebruikt in de multikey-indexering voor een document in de verzameling. D.w.z. U kunt geen multikey-index maken voor het commando en de gegevens hieronder
U kunt geen index met meerdere toetsen maken{ _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
{ nums: 1, scores: 1 }
- Als de multikey-index al bestaat, kunt u geen document invoegen dat deze beperking schendt. Dit wil zeggen als we
Na het maken van een samengestelde multikey-index, een poging om een document in te voegen waarin zowel de velden nums als scores arrays zijn, mislukt de invoeging van de database.{ _id: 1, nums: 1, scores: [ 30, 60 ]} { _id: 1, nums: [ 1, 2 ], scores: 30}
- Er kan slechts één matrixveld worden gebruikt in de multikey-indexering voor een document in de verzameling. D.w.z. U kunt geen multikey-index maken voor het commando en de gegevens hieronder
-
Tekstindexen
Tekstindexen worden vaak gebruikt om zoekopdrachten voor een tekenreeks in een verzameling te verbeteren. Ze slaan geen taalspecifieke stopwoorden op (d.w.z. "de", "a", "of"). Een collectie kan maximaal één tekstindex hebben. Om een tekstindex te maken:
db.collection.createIndex({Name:”text”})
U kunt ook meerdere velden indexeren, bijv.
db.collection.createIndex({ Name:”text”, place:”text” })
Een samengestelde index kan een tekstindexsleutel bevatten in combinatie met de oplopende/aflopende indexsleutel, maar:
- Alle tekstindexsleutels moeten naast elkaar staan in het indexspecificatiedocument bij het maken van een samengestelde tekstindex.
- Er mogen geen andere speciale indextypen, zoals indexvelden met meerdere toetsen, worden gebruikt in de samengestelde tekstindex.
- Om een $text-zoekopdracht uit te voeren, moet het predikaat van de zoekopdracht gelijkheidsvoorwaarden bevatten voor de voorgaande sleutels.
-
Gehashte indexen
Sharding is een van de technieken die in MongoDB worden gebruikt om horizontale schaling te verbeteren. Sharding omvat vaak een op hash gebaseerd concept door gebruik te maken van gehashte indexen. De meer willekeurige verdeling van waarden langs hun bereik wordt weergegeven door deze indexen, maar ondersteunen alleen gelijkheidsovereenkomsten en kunnen geen op bereik gebaseerde zoekopdrachten ondersteunen.
Algemene operationele overwegingen voor indexen
- Elke index vereist minimaal 8kB aan dataruimte.
- Als deze actief is, zal elke index wat schijfruimte en geheugen in beslag nemen. Dit is belangrijk wanneer het wordt bijgehouden in capaciteitsplanning.
- Voor een verzameling met een hoge lees-naar-schrijfverhouding verbeteren extra indexen de prestaties en hebben ze geen invloed op niet-geïndexeerde leesbewerkingen.
Beperkingen van het gebruik van indexen
- Het toevoegen van een index heeft een negatieve invloed op de prestaties van schrijfbewerkingen, met name voor verzamelingen met een hoge schrijf-naar-leesratio. Indexen zullen duur zijn omdat elke invoeging ook elke index moet bijwerken.
- MongoDB zal geen index maken, bijwerken of invoegen in een geïndexeerde verzameling als de indexvermelding voor een bestaand document de indexsleutellimiet overschrijdt.
- Voor bestaande shard-verzamelingen mislukt de chunk-migratie als de chunk een document heeft dat een geïndexeerd veld bevat met een indexitem dat de indexsleutellimiet overschrijdt.
Conclusie
Er zijn zoveel manieren om de MongoDB-prestaties te verbeteren, indexering is daar een van. Indexering vergemakkelijkt querybewerkingen door de latentie te verminderen waarmee gegevens worden opgehaald door op de een of andere manier het aantal documenten dat moet worden gescand, te minimaliseren. Er zijn echter enkele overwegingen die u moet maken voordat u besluit een specifiek type index te gebruiken. Collecties met een hoge lees-naar-schrijfverhouding gebruiken doorgaans indexen beter dan collecties met hoge schrijf-naar-leesbewerkingen.