Se eseguo una query mongo dalla shell con explain(), ottenere il nome dell'indice utilizzato e quindi eseguire di nuovo la stessa query, ma con hint() che specifica lo stesso indice da utilizzare - campo "millis" da spiegare piano è diminuito significativamentePerché suggerimento di Mongo rende una query eseguita fino a 10 volte più velocemente?
per esempio
nessun suggerimento disponibile:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 24,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
suggerimento disponibile:
>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();
{
"cursor" : "BtreeCursor my_super_index",
"nscanned" : 599,
"nscannedObjects" : 587,
"n" : 3,
"millis" : 2,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : { ... }
}
L'unica differenza è il campo "millis"
Qualcuno sa perché è così?
UPDATE: "Selezionare quale indice usare" non lo spiega, perché mongo, per quanto ne so, seleziona l'indice per ogni esecuzione X (100?), Quindi dovrebbe essere veloce come con il suggerimento successivo (X-1)
Sia l'indice sta accelerando le cose più di tanto, o sei solo ri-esecuzione di una query nella cache, che ha molto molto molto minori costi. –
Non penso sia a causa del caching. Se eseguo la stessa query senza suggerimento 2, 3 o 10 volte non sarà molto più veloce, ma accelera sempre significativamente con il suggerimento. –
Puoi modificare la tua domanda per includere l'output di find (...). Spiega (true) senza il suggerimento. Ciò stamperà ulteriori informazioni che potrebbero aiutare a eseguire il debug di questo. – mstearn