2012-02-20 6 views
9

У меня есть запрос, который занимает слишком много времени для завершения. Мне нравится выполнять некоторые тесты производительности, но после того, как я проверил один раз (что занимает в настоящее время ~ 30 секунд), запрос начинает работать намного быстрее (< 1 секунда). Я предполагаю, что это должно быть с кешированием mongodb. Есть ли способ отключить кеширование mongodb или другим способом, я могу проверить производительность?Как проверить производительность запросов mongodb без кеша

Я использую mongodb, размещенный в mongohq. Программа с Ruby On Rails 3. Вот это объяснить:

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

Обратите внимание, что я должен был укоротить некоторые из объяснить, потому что это было слишком долго. Где «много идентификаторов объектов» было много идентификаторов объектов (~ 400).

Спасибо всем

ответ

2

При первом выполнении запроса, набор данных памяти отображается, но не выгружаемый в реальную память, см Caching на сайте MongoDB. Таким образом, ОС должна перечислить эти данные в память, а затем вы получите выполнение запроса и результат.

Поскольку вы выполняете пейджинг с диска (медленно) в оперативную память (быстро), начальный запуск выполняется медленно, а затем, если у вас нет давления памяти, эти данные будут оставаться в ОЗУ и все ваши последующие запросы по этим данным набор будет быстрым.

Как работает MongoDB, процесс загрузки вашего набора данных в память часто называется «разогревом» базы данных, и только после этого прогревания (в вашем случае первого запроса), который вы получаете истинная производительность.

Следует отметить, что ваш первоначальный запрос, по-видимому, занимает очень много времени, чтобы вернуться. Вы должны убедиться, что он эффективно использует индексы. Лучшим местом для начала исследования является страница explain().

+0

Я все еще хочу, чтобы мой первоначальный запрос работать быстрее, потому что я не могу загрузить все документы в памяти. Итак, я уже использовал объяснение и увидел, что он сканирует ~ 5000 документов для запроса запроса, и я думаю, что 30 секунд слишком много для 5000 документов. Поэтому я хочу продолжать делать один и тот же запрос без кеша, поэтому я не могу проверить, что не так. – Gluz

+0

Был ли запрос использован индексом? Не стесняйтесь добавлять объяснения к вопросу, и я могу взглянуть на результат. –

+0

Добавлено в исходное сообщение. – Gluz

 Смежные вопросы

  • Нет связанных вопросов^_^