2012-05-02 5 views
9

Хорошо, поэтому я создаю приложение, основанное на Node.js, и я использую mongoose для обработки моего соединения с mongodb. У меня есть конечная точка, которая такова:Почему мой монгодб звонит так медленно?

getTestStream : function(req, res, conditions, callback) { 
    Activity.find() 
    .limit(1000) 
    .run(function(err, activities) { 
     if (err){ 
     util.sendError(req, res, "Query Error", err); 
     } else if (activities) {  
     res.send(activities); 
     } else { 
     util.send('nope'); 
     } 
    }); 
} 

По какой-то причине этот вызов занимает 700 мс + для завершения. Тот же вызов, даже не применяя предел, сделанный из оболочки mongodb, возвращается примерно через 4 мс. Похоже, такой простой запрос, так что это замедляет его? Я предполагаю, что я пропустил что-то очевидное в конфигурации где-то, но я понятия не имею.

Спасибо всем, кто может помочь в этом.

Дополнительная информация:

[email protected] 
[email protected] 
[email protected] 
+0

Я не очень знаком с мангуста, так что это просто выстрел в темно- вам необходимо указать свой лимит до вашей команды находят ли? Потому что, может быть, это происходит и сразу же извлекает записи в find(), а затем вы как-то пытаетесь переопределить его? Это выглядит несколько похоже на ваш вопрос: http://stackoverflow.com/questions/5539955/how-to-paginate-with-mongoose-in-node-js –

+0

Изменение запроса для включения ограничения следующим образом не влияет на производительность в любой очевидный путь. Активность.find ({}, {limit: 1000}) .run (функция (ошибка, действия) { –

+0

Насколько велики ваши документы? Можете ли вы разместить db.coll.stats(). –

ответ

9

После экспериментов на некоторое время, я нашел несколько вкладов в медлительность, надеюсь, это поможет кто-нибудь с подобным вопросом:

  • Объектов Я запрашивающие большой, поэтому обработка их занимают некоторое время. Для крупных объектов измените запрос, чтобы возвращать только нужные поля прямо сейчас.
  • Mongoose полезен, но он может действительно замедляться, когда вы запрашиваете множество предметов, поэтому лучше просто напрямую взаимодействовать с node-mongodb-native, если вы хотите скорость для вызова. (Это было примерно на 50% + увеличение скорости для моего сценария)

Используя эти методы, я теперь могу обработать 4000 записей за меньшее время, чем раньше. Спасибо всем, кто прокомментировал, и особая благодарность Gates VP за то, что он указал, что мангуста не очень подходит для такого звонка.

+1

Насколько велики были объекты, которые вы запрашивали? Просто было бы неплохо иметь приблизительное представление о том, насколько большой объект может потребоваться, чтобы вызвать первичную проблему, которую вы видели. –

+2

Они не были огромными, это было некоторое время с тех пор, как я обратился к этой проблеме, возможно, по 4 строковых поля, каждая из которых содержит около 50-100 символов. Имейте в виду, что теперь у mongoose есть опция [lean()] (http://mongoosejs.com/docs/api.html#query_Query-lean), которая удаляет большинство раздутий оболочки getter/setter, а также [stream() ] (http://mongoosejs.com/docs/2.7.x/docs/querystream.html), чтобы вы могли получать результаты по мере их нахождения. –

+0

Спасибо за отзыв для мяса. В настоящее время я извлекаю ~ 280 записей, но они вложены в несколько уровней в глубину, а некоторые суб-документы имеют 200 элементов. Это потребовало моего запроса мангуста от 2,5 секунд до 15 мс (это то, что я получал в оболочке монго). – Leonidas

0

Тот же вызов, даже применяя предел, сделанный из возвращений MongoDB оболочки примерно 4 мс.

Оболочка применяет ограничение по 30 или около того по умолчанию. Попробуйте сделать из оболочки с фактическим пределом?

Кроме того, вы можете попробовать .explain() из Shell.

Если это не работает, вы можете принять предложение @Kyle Banker и проверить the profiler.

+0

Не казаться неблагодарным, но проблема, похоже, не связана с монгодбом. Как я уже сказал в другом комментарии выше: «Если я запускаю db.activities.find(). Limit (1000) .explain() внутри консоли/оболочки mongo, запрос занимает менее 5 миллисекунд». Профилировщик показывает те же результаты при реальных вызовах с конечной точки. Я принимаю его конфигурацию драйвера или что-то общее с оберткой мангуста, потому что до сих пор я не вижу недостатков в части mongodb. –

+1

Итак, я отредактировал теги и добавил Mongoose. Если вы не получите ответ здесь, я определенно проведу их группу Google. Обратите внимание, что Mongoose * * создает объект для обертывания каждого результата, который вы вытаскиваете из БД. Поэтому вполне возможно, что Mongoose просто не оптимизирован для этого. –

+0

Ах хороший звонок. Я думал, что добавил мангуста, но, видимо, нет. Я тестировал эту же функцию с различными (меньшими) объектами базы данных в другой коллекции, и она появляется примерно на 100 мс быстрее, поэтому она может напрямую относиться к тому, насколько сложна запись db относительно того, сколько времени занимает мангуст, чтобы обернуть каждую запись при поиске. –

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