Ho oltre 600k di record in MongoDb. il mio schema utente è simile al seguente:La proiezione rende più lenta la query
{
"_id" : ObjectId,
"password" : String,
"email" : String,
"location" : Object,
"followers" : Array,
"following" : Array,
"dateCreated" : Number,
"loginCount" : Number,
"settings" : Object,
"roles" : Array,
"enabled" : Boolean,
"name" : Object
}
seguente query:
db.users.find(
{},
{
name:1,
settings:1,
email:1,
location:1
}
).skip(656784).limit(10).explain()
risultati in questo:
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 656794,
"nscanned" : 656794,
"nscannedObjectsAllPlans" : 656794,
"nscannedAllPlans" : 656794,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 5131,
"nChunkSkips" : 0,
"millis" : 1106,
"server" : "shreyance:27017",
"filterSet" : false
}
e dopo aver rimosso la proiezione stessa query db.users.find().skip(656784).limit(10).explain()
risultati in questo :
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 10,
"nscannedObjects" : 656794,
"nscanned" : 656794,
"nscannedObjectsAllPlans" : 656794,
"nscannedAllPlans" : 656794,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 5131,
"nChunkSkips" : 0,
"millis" : 209,
"server" : "shreyance:27017",
"filterSet" : false
}
Per quanto ne so, la proiezione aumenta sempre le prestazioni di una query. Quindi non sono in grado di capire perché MongoDB si comporta in questo modo. Qualcuno può spiegarlo. E quando usare la proiezione e quando no. E come effettivamente la proiezione è implementata in MongoDB.
Ricevi questi risultati ripetutamente? La seconda query potrebbe essere più veloce solo perché i dati vengono memorizzati nella cache (caricati in memoria) dalla prima query. – Messa
Poiché applica la proiezione ai documenti 656794 – Sammaye
ma perché applica la proiezione ai documenti 656794 è un'implementazione molto errata. Ho bisogno solo di 10 dischi, quindi la proiezione dovrebbe essere applicata solo a 10 documenti –