MongoDB .toArray () аномально медленно с node.js драйвер после добавления индексов

#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 спасибо. Если вы обнаружите такое же поведение в контролируемой среде, пожалуйста, поделитесь своими шагами, документами, индексами и т.д., Чтобы это можно было воспроизвести.