Ответ 1
Может ли кто-нибудь подтвердить, что эти запросы к шардам выполняются последовательно? Или предложить какое-то другое объяснение?
Без ключа шарда в запросе запрос отправляется всем шардам и обрабатывается параллельно. Однако результаты всех осколков будут объединены в первичном осколке, и, таким образом, он будет ожидать возвращения самого медленного осколка.
Каковы подводные камни для непосредственного обращения к осколкам?
Вы можете включить осиротевшие документы. Запрос через mongos
также проверяет потерянные документы для обеспечения согласованности данных. Следовательно, запросы через mongos
имеют больше накладных расходов, чем запросы непосредственно из каждого шарда.
Измерено с использованием времени запроса Robo 3T
Использование Robo 3T неправильно измеряет время запроса. По умолчанию Robo 3T возвращает первые 50 документов. В реализациях драйверов, если количество возвращаемых документов превышает размер пакета по умолчанию, для извлечения всех документов будут выполняться запросы getmore
к базе данных. Robo 3T дает вам только первый пакет, то есть набор результатов.
Чтобы оценить ваш запрос, добавьте explain('executionStats')
к вашему запросу. Падение производительности - это, вероятно, передача данных между осколками. Поскольку в запросе отсутствует ключ сегмента, результаты всех сегментов должны быть отправлены в сегмент до объединения. Общее время - это не только время запроса (нахождения документов) из механизма Монго, но и время поиска документов.
Выполните команду ниже, и вы увидите входные данные от каждого шарда, чтобы лучше оценить ваш запрос.
db.items.explain('executionStats').aggregate(
[
{ "$match" : {
"$text" : { "$search" : "search terms"}
}
},
{ "$project": { "type_id" : 1, "source_id": 1 } },
{ "$facet" : { "types" : [ { "$unwind" : "$type_id"} , { "$sortByCount" : "$type_id"}] , "sources" : [ { "$unwind" : "$source_id"} , { "$sortByCount" : "$source_id"}]}}
]
);