Mongo - Как объяснить запрос, не выполняя его

Я новичок в Монго и искал, но не вижу конкретного ответа.

Я понимаю, что метод объяснения Mongo будет выполнять запрос параллельно с возможным доступом планы и выбрать план-победитель в зависимости от времени выполнения.

В Руководстве по передовому опыту говорится: «План запроса может быть рассчитан и возвращен без предварительного выполнения запроса». Я не могу найти, как это сделать в документе.

А что, если даже выигрышному плану требуется очень много времени для выполнения, прежде чем он вернет хотя бы небольшой набор результатов, например, сортировку большой коллекции?

Я видел более старые комментарии о том, что выполнение останавливается после возврата первых 101 документа, но снова не могу найти это в официальном документе.

Итак, мой вопрос: Как получить план доступа без выполнения запроса?

Спасибо за вашу помощь. Я использую Монго 3.4.


person Jim Fletcher    schedule 30.07.2017    source источник


Ответы (2)


Вы можете установить уровень детализации функции explain(). По умолчанию он использует queryPlanner, который (если я прав) то, что вы ищете.

Проверьте другие режимы в официальной документации MongoDB об объяснении().

person mgyongyosi    schedule 30.07.2017
comment
Спасибо. Я прочитал документ queryPlanner, но не понял его, потому что в нем говорится, что он не возвращает результаты выполнения, но это явно не означает, что запрос не был выполнен, просто результаты не возвращаются. Я считаю, что вы правы, т. - person Jim Fletcher; 31.07.2017

MongoDB создает планы запросов, выполняя ограниченное подмножество запросов, а затем кэширует план-победитель, чтобы его можно было использовать повторно (пока что-то не приведет к очистке кеша).

Таким образом, «ограниченное подмножество» означает, что он получит документы, которые соответствуют 100 документам в качестве «образца», и не пойдет дальше, но то, что документация означает

План запроса может быть рассчитан и возвращен без предварительного выполнения запроса.

заключается в том, что вы можете сделать объяснение, прежде чем запускать полный запрос. Это хорошая практика, потому что она заранее заполняет кэш планов.

Проще говоря, если MongoDB заметит, что другой запрос занимает больше времени, чем завершенный запрос, он прекратит выполнение и откажется от плана в пользу более эффективного плана. Например, вы можете увидеть это в действии, запустив объяснение allPlansExecution, где индекс выбран вместо colscan.

person Chris Trott    schedule 31.07.2017