Lägg till lite mer till baloo s svar.
Om tidsstämpeln kontra långa nummer. I allmänhet kommer MongoDB-servern inte att se någon skillnad. BSON-kodningslängden är densamma (64 bitar). Du kan se olika prestanda på klientsidan beroende på drivrutinens kodning. Som ett exempel, på Java-sidan a med 10gen-drivrutinen renderas en tidsstämpel som Date
som är mycket tyngre än Long
. Det finns drivrutiner
som försöker undvika dessa omkostnader.
Det andra problemet är att du kommer att se en prestandaförbättring om du stänger intervallet för det första fältet i indexet. Så om du använder indexet som föreslås av baloo :
db.collection.ensureIndex({start: 1, final: 1})
Din fråga kommer att fungera (potentiellt mycket) bättre om du frågar är:
db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)},
final:{$lt:DateTime(...)}})
Konceptuellt, om du tänker på indexen som ett träd, begränsar det stängda området båda sidorna av trädet istället för bara en sida. Utan det stängda intervallet måste servern "kontrollera" alla poster med en start
större än den angivna tidsstämpeln eftersom den inte känner till sambandet mellan start
och final
.
Du kanske till och med upptäcker att frågeprestandan inte är bättre med ett enda fältindex som:
db.collection.ensureIndex({start: 1})
Det mesta av besparingarna kommer från det första fältets beskärning. Det fall då detta inte kommer att vara fallet är när frågan täcks av indexet eller ordningen/sorteringen för resultaten kan härledas från indexet.
HTH - Rob.