sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb indexstrategi för intervallfråga med olika fält

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.



  1. Hur ansluter man mongoDB till python?

  2. Mongodb fråga specifik månad|år inte datum

  3. $nin med $expr

  4. Frågar efter en lista över alla distinkta fält i MongoDB-samlingen