Можно ли запросить MongoDB несколько раз за запрос?
Исходя из фона RDBMS, у меня всегда было впечатление "Постарайтесь изо всех сил, чтобы использовать один запрос, считая его эффективным", что означает, что это дорого стоит для каждого запроса, который вы делаете в базе данных. Когда дело доходит до MongoDB, похоже, что это может быть невозможно, потому что вы не можете присоединиться к таблицам.
Я понимаю, что он не должен быть реляционным, но они также подталкивают его к целям, таким как блоги, форумы и все, с чем я сможем найти RDBMS.
Есть некоторые зависания, которые я пытался понять эффективность MongoDB или NoSQL в целом. Если бы я хотел получить все "сообщения", связанные с определенными пользователями (как если бы они были сгруппированы)... используя MySQL, я бы, вероятно, сделал несколько объединений и получал их с этим.
В MongoDB, предполагая, что мне нужны отдельные коллекции, было бы эффективно использовать большие $in: ['user1', 'user2', 'user3', 'user4',...]?
Через какое-то время этот метод замедляется? Если я включу 1000 пользователей?
И если мне нужно было получить список сообщений, связанных с пользователями X, Y, Z, было бы эффективно и/или быстро использовать MongoDB:
- Получить массив пользователей
- Получить сообщения пользователей в массиве пользователей
2 запроса для одного запроса. Это плохая практика в NoSQL?
Ответы
Ответ 1
Чтобы ответить Q на $в....
Я провел несколько тестов производительности со следующим сценарием:
~ 24 миллиона документов в коллекции
Поиск 1 миллиона из этих документов на основе ключа (индексированного)
Использование драйвера CSharp из .NET
Результаты:
Запрос 1 за раз, однопоточная: 109s
Запрос 1 за раз, multi threaded: 48s
Запрос 100K за раз с использованием $in, single threaded = 20s
Запрос 100K за раз с использованием $in, multi threaded = 9s
Значительно лучше производительность с использованием большого $in (ограниченного максимальным размером запроса).
Update:
Следуя приведенным ниже комментариям о том, как $in выполняет с различными размерами блоков (запросы многопоточные):
Запрос 10 за раз (100000 партий) = 8.8s
Запрос 100 за раз (10000 партий) = 4.32s
Запрос 1000 за раз (1000 партий) = 4.31s
Запрос 10000 за один раз (100 партий) = 8.4s
Запрос 100000 за раз (10 партий) = 9 с (на исходные результаты выше)
Таким образом, похоже, что это сладость для того, сколько значений должно быть включено в предложение $in в сравнении с количеством раундов.