2011-10-11 13 views
17

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)

+3

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. –

+0

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. –

+0

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

risposta

17

Mongo utilizza un algoritmo per determinare quale indice da utilizzare quando non viene fornito alcun suggerimento e quindi memorizza l'indice utilizzato per la query simile per il prossimo 1000 chiamate

Ma ogni volta che si spiega una query Mongo sarà sempre eseguire il algoritmo di selezione dell'indice, quindi la spiegazione() con hint richiederà sempre meno tempo rispetto a explain() senza accenno.

domanda simile è stato risposto qui Understanding mongo db explain

+0

Suoni ragionevoli. Avete riferimenti alla documentazione? –

+0

http://stackoverflow.com/questions/12510974/understanding-mongo-db-explain –

+2

"Inoltre, l'operazione $ explain rivaluta una serie di piani di query candidati, che possono causare l'operazione $ explain in modo diverso rispetto a una query normale Di conseguenza, queste operazioni forniscono in genere un resoconto preciso di come MongoDB eseguirà la query, ma non riflettono la lunghezza di queste query Quando si esegue explain() con hint(), Query Optimizer non rivaluta i piani di query. " Estratto da http://docs.mongodb.org/manual/reference/operator/explain/#op._S_explain –

6

Mongo ha effettuato la stessa ricerca entrambe le volte che è possibile vedere dal numero di oggetti scansionati. Inoltre puoi vedere che l'indice usato era lo stesso (dai un'occhiata alla voce "cursore"), entrambi usati già il tuo indice my_super_index.

"suggerimento" indica solo a Mongo di utilizzare quell'indice specifico che ha già fatto automaticamente nella prima query.

La seconda ricerca era semplice più veloce perché probabilmente tutti i dati erano già nella cache.

+1

Questo è assolutamente corretto. La prima query è più lunga perché la pagina è in errore e ha caricato i dati dal disco. Per testare le prestazioni in questo modo, è necessario eseguirlo migliaia di volte in tutti i tipi di circostanze simili a quello che sarà il carico di produzione e mediare i risultati per avvicinarsi a un benchmark accurato. – marr75

+0

Una nota, tuttavia, i dati non sono probabilmente nella "cache", i file del database sono mappati in memoria e sono già stati caricati nella memoria di sistema. Mongo mantiene le cose semplici con la memoria che mappa i suoi file e lascia che il sistema operativo decida quando scambiare le pagine, quasi sempre in base alla frequenza e alla recency dell'accesso. – marr75

+0

vedere la mia sezione UPDATE –

2

Ho faticato a trovare la ragione per la stessa cosa. Ho scoperto che quando abbiamo molti indici, mongo impiega più tempo rispetto all'utilizzo di suggerimenti. In pratica, Mongo impiega molto tempo per decidere quale indice utilizzare. Pensa a uno scenario in cui hai 40 indici e fai una query. Il primo compito che Mongo deve fare è quale indice sia il più adatto per essere usato per una particolare query. Ciò implicherebbe che mongo deve eseguire la scansione di tutte le chiavi e fare un po 'di calcolo in ogni scansione per trovare un indice di rendimento se questa chiave viene utilizzata. il suggerimento accelererà sicuramente poiché la scansione della chiave dell'indice verrà salvata.

+0

risposta semplicemente comprensibile –

Problemi correlati