#node.js #mongodb
#node.js #mongodb
Вопрос:
Я знаю, что есть несколько других вопросов SO по этому поводу, но, похоже, ни один из них на самом деле не отвечает на него.
У меня есть простая коллекция, в которой содержится менее 10 документов (на данный момент, во время тестирования, в конечном итоге будет до 100 КБ), каждый довольно маленький (согласно Compass, средний размер документа составляет 200 Б ~).
Выполнение простого collection.find({}).toArray()
иногда занимает до 100 мс! Мне это кажется абсурдным. Если я запускаю его 20 раз подряд (с паузой между каждым из них), иногда это занимает 100 мс, а иногда и 1 мс, и чаще всего что-то среднее между 50-60 мс.
Что могло бы быть причиной этого несоответствия? Похоже, что если это одни и те же документы, время, затрачиваемое драйвером на их преобразование в объект javascript, было бы довольно последовательным. Кроме того, почему иногда может потребоваться 100 мс для преобразования менее 2 кб документов в объекты javascript? JSON.parse()
например, для выполнения той же задачи из строки того же размера требуется 0,1 мс.
В прошлом я использовал MongoDB в нескольких проектах и не припомню, чтобы когда-либо возникали подобные проблемы с производительностью.
Есть ли лучший способ отправить эти данные обратно клиенту, чем toArray()
. Есть ли что-то, чего мне не хватает, что снижает производительность?
—РЕДАКТИРОВАТЬ—
У меня есть 7 индексов в этой коллекции (6 минус _id).
Я создал идентичную коллекцию без индексов (кроме _id) и добавил в нее такое же количество документов. Точно такой же запуск collection.find({}).toArray()
для коллекции без индекса постоянно занимает 1 мс или меньше! Таким образом, каким-то образом добавление индексов в коллекцию toArray()
значительно замедляется.
Насколько я понимаю, добавление индекса увеличит insert()
время, но не должно повлиять find()
, кроме повышения производительности запросов при использовании индекса. Итак, почему я должен видеть резкое снижение find().toArray()
производительности после добавления некоторых индексов?
Комментарии:
1. Создали ли вы идентичную коллекцию в том же экземпляре MongoDB? Какой размер оперативной памяти вы используете? какой механизм хранения вы используете? выполняли ли вы какие-либо другие запросы на чтение, которые возвращали большой объем данных из другой коллекции?
2. @Mani, да, это в том же экземпляре. Разработка на MacBook pro с 16 ГБ оперативной памяти. WireTiger, последняя версия MongoDB. Никакие другие операции с базой данных не выполнялись, пока я проводил эти тесты.
3. @delashum Я подозреваю, что это как-то связано со средой, в которой он развернут. Пробовали ли вы этот эксперимент, например, в автономном экземпляре EC2, чтобы удалить переменную фоновых задач, нехватки памяти и т.д.? Будет интересно, если вы увидите это в более контролируемой среде.
4. @KevinAdistambha Ладно, на это стоит обратить внимание. Я пока не совсем верю, что это все, потому что, если я отслеживаю потребление памяти на своих машинах и уровни процессора при выполнении этих запросов, они кажутся довольно простыми. Однако в ближайшие несколько дней я запущу экземпляр и проведу его тест.
5. @delashum спасибо. Если вы обнаружите такое же поведение в контролируемой среде, пожалуйста, поделитесь своими шагами, документами, индексами и т.д., Чтобы это можно было воспроизвести.