Можно ли запрашивать MongoDB несколько раз за запрос? - PullRequest
18 голосов
/ 01 марта 2011

Исходя из опыта работы с СУБД, у меня всегда возникало впечатление: «Старайтесь изо всех сил использовать один запрос, предполагая, что он эффективен», что означает, что он обходится дорого для каждого запроса в базу данных. Когда дело доходит до MongoDB, кажется, что это невозможно, потому что вы не можете объединять таблицы.

Я понимаю, что он не должен быть реляционным, но они также продвигают его для целей, таких как блоги, форумы и другие вещи, с которыми мне будет проще найти СУРБД.

Есть некоторые зависания, которые я пытался понять в целом эффективность MongoDB или NoSQL. Если бы я хотел получить все "сообщения", относящиеся к определенным пользователям (как если бы они были сгруппированы) ... используя MySQL, я бы, вероятно, сделал несколько объединений и получил бы это.

В MongoDB, при условии, что мне нужны отдельные коллекции, будет ли эффективно использовать большой $ in: ['user1', 'user2', 'user3', 'user4', ...]?

Этот метод замедляется через некоторое время? Если я включу 1000 пользователей? И если бы мне нужно было получить этот список сообщений, связанных с пользователями X, Y, Z, было бы эффективно и / или быстро использовать MongoDB:

  • Получить массив пользователей
  • Получить сообщения в массиве пользователей

2 запроса на один запрос. Это плохая практика в NoSQL?

1 Ответ

35 голосов
/ 01 марта 2011

Чтобы ответить на вопрос о $ in ....

Я провел несколько тестов производительности по следующему сценарию:

~ 24 миллиона документов в коллекцииПоиск 1 миллиона этих документов на основе ключа (проиндексированного)Использование драйвера CSharp из .NET

Результаты: Запросы 1 за один раз, однопоточные: 109 сЗапросы 1 за один раз, многопоточные: 48 сЗапрашивать 100K за раз, используя $ in, однопоточное = 20 сЗапрашивать 100K за раз, используя $ in, многопоточность = 9 с

Значительно улучшена производительность при использовании большого $ in (ограничено максимальным размером запроса).

Обновление: Следуя комментариям ниже о том, как $ in работает с другим чанкомразмеры (запросы многопоточные):

Запросы 10 одновременно (100000 пакетов) = 8,8 сЗапрос 100 одновременно (10000 пакетов) = 4,32 сЗапрос 1000 одновременно (1000 пакетов) = 4,31 сЗапрос 10000 за раз (100 пакетов) = 8,4 сЗапрос 100000 за один раз (10 пакетов) = 9 с (согласно исходным результатам выше)

Так что, похоже, есть хорошее место для того, сколько значений можно объединить в предложение $ in по сравнению с числомпоездок туда и обратно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...