Почему мой вызов mongodb так медленный?

хорошо, поэтому я создаю приложение, основанное на узле.js и я используем мангуста для обработки моего соединения с 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');
      }
  });
}

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

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

прочая информация:

mongoose@2.6.0
mongodb@2.0.4
node@0.6.9

3 ответов


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

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

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


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

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

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

Если ничего из этого не работает, то вы можете принять предложение @Kyle Banker и проверить профайлер.


оформить заказ ensureIndex Это ускорит ваш поиск