Почему мой вызов 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 и проверить профайлер.