2012-02-20 12 views
9

Mam zapytanie, które trwa zbyt długo, aby zakończyć. Chciałbym wykonać pewne testy wydajności, ale po tym, jak sprawdzę jeden raz (trwa to ~ 30 sekund), zapytanie zaczyna działać znacznie szybciej (< 1 sekunda). Zakładam, że musi to być z buforowaniem mongodb. Czy istnieje sposób wyłączenia buforowania dla mongodb lub w inny sposób mogę sprawdzić wydajność?Jak mogę sprawdzić wydajność zapytania mongodb bez pamięci podręcznej?

Używam mongodów hostowanych w mongohq. Program z Ruby on Rails 3. Oto wyjaśnienie:

{"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)]]}}} 

Zauważ, że musiałem obciąć niektóre z wyjaśniać, ponieważ był zbyt długi. Tam, gdzie jest "dużo identyfikatorów obiektów", było wiele identyfikatorów obiektów (~ 400).

Dzięki wszystkim

Odpowiedz

2

Po pierwszym uruchomieniu kwerendy, zestaw danych jest odwzorowany w pamięci, ale nie został przywoływany do rzeczywistej pamięci, patrz Caching na stronie MongoDB. System operacyjny musi więc przywołać zestaw danych do pamięci, a następnie uruchomić zapytanie i wynik.

Ponieważ następuje wywołanie z dysku (wolnego) do pamięci RAM (szybkie), początkowe uruchomienie jest powolne, a następnie, o ile nie ma się ciśnienia pamięci, dane pozostaną w pamięci RAM i wszystkie kolejne kwerendy na tych danych zestaw będzie szybki.

W ten sposób MongoDB został zaprojektowany do działania, proces ładowania zbioru danych do pamięci jest często nazywany "rozgrzewaniem" bazy danych i dopiero po tym rozgrzewaniu (w twoim przypadku pierwsze zapytanie) otrzymujesz prawdziwy występ.

Warto zauważyć, że początkowe zapytanie w dalszym ciągu zabiera bardzo dużo czasu. Powinieneś upewnić się, że skutecznie korzysta z indeksów. Najlepszym miejscem do rozpoczęcia tego śledztwa jest strona explain().

+0

Nadal chcę moje pierwsze zapytanie, aby działał szybciej, ponieważ nie mogę załadować wszystkie dokumenty do pamięci. Tak więc użyłem już wyjaśnienia i zobaczyłem, że skanuje on ~ 5000 dokumentów, aby pobrać zapytanie i myślę, że 30 sekund to za dużo dla 5000 dokumentów. To dlatego chcę nadal robić to samo zapytanie bez pamięci podręcznej, więc nie mogę przetestować, co jest nie tak. – Gluz

+0

Czy zapytanie używało indeksu? Możesz dodać wyjaśnienie do pytania i mogę rzucić okiem na wynik. –

+0

Dodano w oryginalnej wiadomości. – Gluz