Føj også lidt mere til baloo 's svar.
Om tidsstemplet vs. lang udgave. Generelt vil MongoDB-serveren ikke se en forskel. BSON-kodningslængden er den samme (64 bit). Du kan muligvis se en ydelse anderledes på klientsiden afhængigt af driverens kodning. Som et eksempel, på Java-siden a ved hjælp af 10gen-driveren gengives et tidsstempel som Date
det er meget tungere end Long
. Der er drivere
der forsøger at undgå den overhead.
Det andet problem er, at du vil se en præstationsforbedring, hvis du lukker intervallet for det første felt i indekset. Så hvis du bruger indekset foreslået af baloo :
db.collection.ensureIndex({start: 1, final: 1})
Din forespørgsel vil fungere (potentielt meget) bedre, hvis du forespørger er:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)},
final:{$lt:DateTime(...)}})
Konceptuelt, hvis du tænker på indeksene som et træ, begrænser det lukkede område begge sider af træet i stedet for kun den ene side. Uden det lukkede område skal serveren "tjekke" alle indgange med en start
større end det angivne tidsstempel, da det ikke kender sammenhængen mellem start
og final
.
Du kan endda opdage, at forespørgselsydeevnen ikke er bedre ved at bruge et enkelt feltindeks som:
db.collection.ensureIndex({start: 1})
Størstedelen af besparelsen er fra den første marks beskæring. Det tilfælde, hvor dette ikke vil være tilfældet, er, når forespørgslen er dækket af indekset, eller rækkefølgen/sorteringen af resultaterne kan udledes af indekset.
HTH - Rob.