@AlexeyZernov

MongoDB выборка на шардинге, ищет параллельно по всем нодам?

Добрый день всем!
Интересует вопрос. Например я реализовал авто-шардинг MongoDB на несколько нод, предположим 10.
Есть коллекция "users" с 20 млн. документов, которые хранит всех пользователей. Они размазываются по всем нодам по id. И тут необходимо зарегистрировать нового пользователя с уникальным username. Делаем запрос:
db.posts.find({"username":"..."})
если возратил 0 записей то регистрируем с таким username.
Вот вопрос, MongoDB будет бегать по всем нодам и записям поочередно или параллельно? Просто это решение не выглядит таким производительным.
Такой же пример можно привести с комментариями к записи, комментарии размазаны по нодам и чтобы вывести их всех MongoDB ищет их среди всех нод и выводит?
  • Вопрос задан
  • 507 просмотров
Пригласить эксперта
Ответы на вопрос 4
virtuozzz
@virtuozzz
Web Developer
А зачем делать find? У вас может сложиться ситуация когда в один момент времени могут регистрироваться два юзера с одинаковым именем. И получается, что find обоит вернет false, а вот при вставке данных кто-то увидит ошибку. Лучше делать индекс по полю username и просто вставлять данные. Если данные вставились, то ок, если нет - значит невалидное имя пользователя. Получается у вас будет всегда выполняться один запрос, вместо двух.

По теме:
поиск по уникальному индексу сразу попадет на нужный шард безо всяких дополнительных сканов.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
Параллельно конечно.
Если бы оно бегало поочереди смысла в шарде вообще не было бы.
Ответ написан
Комментировать
@lega
Они размазываются по всем нодам по id

Зачем по id?

Сделайте уникальный индекс (шардинг) по username, тогда запрос будет к конкретному шарду в котором это имя (есть или должно быть). И при добавлении не нужно будет проверять, т.к. дубль имени не запишется (будет ошибка).
Ответ написан
Комментировать
@ZOXEXIVO
Mongos.exe анализирует запрос и смотрит, есть ли внутри него обращение к shard-key. Если он там есть, то запрос идет к конкретному шарду, иначе - отправляются запросы ко всем шардам одновременно и аггрегируются
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы