Mam ponad 600 000 rekordów w MongoDb. moim schemacie użytkownik wygląda następująco:Projekcja sprawia, że zapytanie wolniejsze
{
"_id" : ObjectId,
"password" : String,
"email" : String,
"location" : Object,
"followers" : Array,
"following" : Array,
"dateCreated" : Number,
"loginCount" : Number,
"settings" : Object,
"roles" : Array,
"enabled" : Boolean,
"name" : Object
}
następujące zapytanie:
db.users.find(
{},
{
name:1,
settings:1,
email:1,
location:1
}
).skip(656784).limit(10).explain()
wyniki w to:
{
"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
}
i po usunięciu projekcja samego zapytania db.users.find().skip(656784).limit(10).explain()
wyniki w tym :
{
"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
}
O ile wiem, projekcja zawsze zwiększa wydajność zapytania. Nie jestem w stanie zrozumieć, dlaczego MongoDB zachowuje się w ten sposób. Czy ktoś może to wyjaśnić? A kiedy użyć projekcji, a kiedy nie. I jak właściwie projekcja jest zaimplementowana w MongoDB.
Czy otrzymujesz te wyniki wielokrotnie? Drugie zapytanie może być szybsze tylko dlatego, że dane są buforowane (ładowane do pamięci) z pierwszego zapytania. – Messa
Ponieważ stosuje się projekcję do dokumentów 656794 – Sammaye
, ale dlaczego stosuje ona projekcję do dokumentów 656794, jest to bardzo błędna implementacja. Potrzebuję tylko 10 rekordów, więc projekcja powinna być zastosowana tylko do 10 dokumentów. –