Учитывая уровень детализации в вашем вопросе, я собираюсь сосредоточиться на «запросе большой коллекции» и предположить, что вы используете механизм хранения MMAPv1 без покрытия индекса по вашему запросу.
Вы связаны диском?
Учитывая приведенные выше предположения, вы можете циклически перемещать данные между ОЗУ и диском. У Mongo установлен предел по умолчанию на уровне 100 МБ, поэтому, если ваш запрос должен проверять множество документов (без индексации), постраничными могут быть данные подкачки с диска на ОЗУ. Я слышал о оболочке манго, которая описывается или блокируется/завершается при превышении ограничений памяти.
32-битные системы также могут создавать серьезные ограничения памяти для больших коллекций.
Вы можете посмотреть свой монитор активности на конкретной ОС, чтобы узнать, является ли это вашей проблемой.
Насколько велика ваша коллекция?
Дальше, насколько велика ваша коллекция? Вы можете show collections
и посмотреть физический размер коллекции, а также db.cards.count()
, чтобы увидеть свой рекорд. Это помогает количественно определить «большую коллекцию».
ПРИМЕЧАНИЕ: вам могут понадобиться расширения mongo-hacker, чтобы увидеть использование коллекции дисков в коллекциях шоу.
Монго исследование оболочки
В Монго оболочки, у вас есть еще несколько мест, чтобы смотреть. По умолчанию mongo будет записывать медленные запросы (> 100 мс). После истечения 90 с тайм-аута:
db.adminCommand({getLog: "global" })
и ищите записи журнала медленного запроса.
Далее посмотрите на ваш план запросов-выигрышей.
var e = db.cards.explain()
e.find("Field":"Something")
Я предполагаю, что вы увидите
"stage": "COLLSCAN",
Это означает, что вы делаете полный сбор сканирования и вам необходимо покрытие индекса для вашего запроса (хорошая идея для запросов и сортировки).
Предложения
Вы должны иметь по крайней мере, частичное покрытие индекса на любом производстве запроса. Правильный индекс должен решить вашу проблему (если у вас нет документов> 16 МБ).
Другой подход (который я не рекомендую - индексация лучше), чтобы использовать курсор вместо
var cursor = db.cards.find("Field":"Something")
while (cursor.hasNext()) {
print(tojson(cursor.next()));
}
В зависимости от основной причины, это может работать для вас.
Попробуйте использовать 'db.cards.find(). AddOption (DBQuery.Option.noTimeout);'. Сколько документов у вас есть в коллекции карт? – Rudra