2012-09-20 2 views
27

ho sparato una query e cercato di spiegare che su console mongo e ottenutomongo intesa db spiegare

"isMultiKey" : true, 
"n" : 8, 
"nscannedObjects" : 17272, 
"nscanned" : 17272, 
"nscannedObjectsAllPlans" : 21836, 
"nscannedAllPlans" : 21836, 
"scanAndOrder" : true, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 184, 

maggior parte delle cose sono spiegate in http://www.mongodb.org/display/DOCS/Explain, ma non riesco a capire che cosa fa nscannedObjectsAllPlans, nscannedAllPlans significa. Qualcuno può aiutare?

Grazie

risposta

23

nscanned e nscannedObjects rapporto risultati per il piano vincente.

nscannedAllPlans e nscannedObjectsAllPlans di report dei risultati per tutti i piani

Per esempio:

>t = db.jstests_explainb; 
>t.drop(); 

>t.ensureIndex({ a:1, b:1 }); 
>t.ensureIndex({ b:1, a:1 }); 

>t.save({ a:0, b:1 }); 
>t.save({ a:1, b:0 }); 

>t.find({ a:{ $gte:0 }, b:{ $gte:0 } }).explain(true); 
{ 
    "cursor": "BtreeCursor a_1_b_1", 
    "isMultiKey": false, 
    "n": 2, 
    "nscannedObjects": 2, 
    "nscanned": 2, 
    "nscannedObjectsAllPlans": 6, 
    "nscannedAllPlans": 6, 
    "scanAndOrder": false, 
    "indexOnly": false, 
    "nYields": 0, 
    "nChunkSkips": 0, 
    "millis": 2, 
... 
} 
+0

Quindi dovrei preoccupare se nscannedObjectsAllPlans, nscannedAllPlans stanno dando grande valore, mentre il nscanned è ancora nel range accettabile? –

+0

Io non la penso così - credo che sia solo quando viene chiamato explain() che esegue quegli altri piani in primo luogo. – Konklone

+3

L'esecuzione di più piani è fondamentalmente il modo in cui MongoDB decide quale piano di query deve utilizzare. Esegue tutti i piani che potrebbe utilizzare in parallelo la prima volta che viene eseguita la query, quindi periodicamente dopo un numero di query o modifiche ai dati. Non appena lo si finisce, lo memorizza nella cache come piano da usare, cancella gli altri e utilizzerà quel piano fino alla prossima volta che decide di aggiornarlo. –