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