2012-02-20 12 views
9

Ho una query che impiega troppo tempo per terminare. Mi piace fare alcuni test delle prestazioni, ma dopo aver controllato per una volta (che richiede attualmente ~ 30 secondi) la query inizia a correre molto più veloce (< 1 secondo). Suppongo che deve essere con il caching mongodb. C'è un modo per disabilitare la cache per mongodb o un altro modo per controllare le prestazioni?Come posso verificare le prestazioni della query mongodb senza cache

Sto usando mongodb ospitato in mongohq. Programma con Ruby on Rails 3. Ecco l'spiegare:

{"cursor"=>"BtreeCursor start_-1", "nscanned"=>5276, "nscannedObjects"=>5276, "n"=>25, "millis"=>3264, "nYields"=>0, "nChunkSkips"=>0, "isMultiKey"=>false, "indexOnly"=>false, "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}, "allPlans"=>[{"cursor"=>"BtreeCursor attendees_count_-1", "indexBounds"=>{"attendees_count"=>[[1.7976931348623157e+308, 1]]}}, {"cursor"=>"BtreeCursor images_count_-1", "indexBounds"=>{"images_count"=>[[1.7976931348623157e+308, 2]]}}, {"cursor"=>"BtreeCursor start_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor start_-1_end_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]], "end"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor attendees._id_1 multi", "indexBounds"=>{"attendees._id"=>[[BSON::ObjectId('4f0b621e94bb688563000007'),BSON::ObjectId('4f0b621e94bb688563000007')], [BSON::ObjectId('4f0b647d5a8c00acde05236f'), BSON::ObjectId('4f0b647d5a8c00acde05236f')], [BSON::ObjectId('4f0b647d5a8c00acde052370'), BSON::ObjectId('4f0b647d5a8c00acde052370')], [BSON::ObjectId('4f0b647d5a8c00acde052371'), BSON::ObjectId('4f0b647d5a8c00acde052371')], [BSON::ObjectId('4f0b647d5a8c00acde052372'), BSON::ObjectId('4f0b647d5a8c00acde052372')], [BSON::ObjectId('4f0b647d5a8c00acde052373') ... (lots of Object IDs)]]}}} 

Si noti che ho dovuto troncare alcuni dei spiegare perché era troppo lunga. Dove ci sono "molti ID oggetto" c'erano molti ID oggetto (~ 400).

Grazie a tutti

risposta

2

Quando siete primo esegue la query, il set di dati è la memoria mappata, ma non è stato paging nella memoria reale, vedere Caching sul sito MongoDB. Il sistema operativo deve quindi archiviare il set di dati in memoria e quindi eseguire la query e il risultato.

Poiché si esegue il cercapersone dal disco (lento) alla RAM (veloce), la corsa iniziale è lenta e quindi, a meno che non si disponga della pressione della memoria, i dati rimarranno nella RAM e tutte le query successive su tali dati il set sarà veloce.

Questo è il modo in cui MongoDB è progettato per funzionare, il processo di caricamento del set di dati in memoria viene spesso chiamato "riscaldamento" del database ed è solo dopo il riscaldamento (nel tuo caso la prima query) che ottieni la vera performance.

Vale la pena notare che la query iniziale sembra richiedere ancora molto tempo per il reso. Dovresti assicurarti che stia usando gli indici in modo efficace. Il posto migliore in cui iniziare l'indagine è la pagina explain().

+0

voglio ancora la mia domanda iniziale per correre più veloce perché non riesco a caricare tutti i documenti in memoria. Quindi, ho già spiegato e ho visto che esegue la scansione di 5000 documenti per recuperare la query e penso che 30 secondi siano troppo per 5000 documenti. Questo è il motivo per cui voglio continuare a fare la stessa query senza cache, quindi non posso testare cosa non va. – Gluz

+0

La query utilizzava un indice? Sentiti libero di aggiungere la spiegazione alla domanda e posso dare un'occhiata all'output. –

+0

Aggiunto nel messaggio originale. – Gluz

Problemi correlati