sql >> Database >  >> NoSQL >> MongoDB

hoe een samengestelde index in mongodb te structureren

Dat zijn veel vragen in één post;) Ik zal ze in een praktische volgorde doornemen:

  • Elke zoekopdracht kan maximaal één index gebruiken (met uitzondering van $or-clausules op het hoogste niveau en dergelijke). Dit omvat alle sortering.
  • Vanwege het bovenstaande heb je zeker een samengestelde index nodig voor je probleem in plaats van aparte indexen per veld.
  • Velden met een lage kardinaliteit (dus velden met zeer weinig unieke waarden in uw dataset) zouden normaal gesproken niet in de index moeten staan, omdat hun selectiviteit zeer beperkt is.
  • De volgorde van de velden in uw samengestelde index is van belang, evenals de relatieve richting van elk veld in uw samengestelde index (bijvoorbeeld "{name:1, leeftijd:-1}"). Er is veel documentatie over samengestelde indexen en indexveldrichtingen op mongodb.org, dus ik zal het hier niet allemaal herhalen.
  • Sorteren gebruikt de index alleen als het sorteerveld in de index staat en het veld in de index is direct na het laatste veld dat is gebruikt om de resultatenset te selecteren. In de meeste gevallen zou dit het laatste veld van de index zijn.

U moet dus helemaal geen status in uw index opnemen, want zodra de indexwandeling de overgrote meerderheid van documenten op basis van hogere kardinaliteitsvelden heeft geëlimineerd, zullen er in de meeste gevallen hoogstens 2-3 documenten over zijn, wat nauwelijks wordt geoptimaliseerd door een statusindex (vooral omdat je zei dat die 2-3 documenten waarschijnlijk toch dezelfde status hebben).

De laatste opmerking die in uw geval relevant is, is dat wanneer u bereikquery's gebruikt (en dat bent u ook), het de index sowieso niet zal gebruiken om te sorteren. U kunt dit controleren door naar de "scanAndOrder"-waarde van uw explain() te kijken zodra u uw query heeft getest. Als die waarde bestaat en waar is, betekent dit dat de resultatenset in het geheugen wordt gesorteerd (scannen en ordenen) in plaats van de index rechtstreeks te gebruiken. Dit kan in uw specifieke geval niet worden vermeden.

Dus uw index zou daarom moeten zijn:

db.posts.ensureIndex({start:1, end:1})

en uw zoekopdracht (volgorde alleen voor de duidelijkheid aangepast, queryoptimalisatie voert uw oorspronkelijke zoekopdracht uit via hetzelfde uitvoeringspad, maar ik geef er de voorkeur aan om geïndexeerde velden eerst en in volgorde te plaatsen):

db.posts.find({start: {$lt: today}, end: {$gt: today}, status: {$gte:0}}).sort({sortOrder:1})



  1. Importeer csv-gegevens als array in mongodb met behulp van mongoimport

  2. Gebruik mock MongoDB-server voor unit-test

  3. Betrouwbare bibliotheken voor Spring boot redis-integratietests

  4. 5 manieren om de seconden van een date te krijgen in MongoDB