Voeg ook een beetje meer toe aan baloo 's antwoord.
Over de tijdstempel versus de lange kwestie. Over het algemeen zal de MongoDB-server geen verschil zien. De lengte van de BSON-codering is hetzelfde (64 bits). Mogelijk ziet u een andere prestatie aan de clientzijde, afhankelijk van de codering van het stuurprogramma. Als voorbeeld wordt aan de Java-kant a met behulp van de 10gen-driver een tijdstempel weergegeven als Date
dat is een stuk zwaarder dan Long
. Er zijn stuurprogramma's
die die overhead proberen te vermijden.
Het andere probleem is dat u een prestatieverbetering zult zien als u het bereik voor het eerste veld van de index sluit. Dus als u de index gebruikt die wordt voorgesteld door baloo :
db.collection.ensureIndex({start: 1, final: 1})
Uw zoekopdracht presteert (potentieel veel) beter als uw zoekopdracht is:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)},
final:{$lt:DateTime(...)}})
Conceptueel, als je de indexen als een boom beschouwt, beperkt het gesloten bereik beide zijden van de boom in plaats van slechts één kant. Zonder het gesloten bereik moet de server alle vermeldingen "aanvinken" met een start
groter is dan de opgegeven tijdstempel omdat het de relatie tussen start
. niet kent en final
.
U kunt zelfs ontdekken dat de queryprestaties niet beter zijn als u een enkele veldindex gebruikt, zoals:
db.collection.ensureIndex({start: 1})
De meeste besparingen zijn afkomstig van het snoeien van het eerste veld. Het geval waarin dit niet het geval is, is wanneer de zoekopdracht wordt gedekt door de index of de volgorde/sortering van de resultaten kan worden afgeleid uit de index.
HTH - Rob.