Почему подсказка Mongo заставляет запрос выполняться в 10 раз быстрее? - PullRequest
21 голосов
/ 11 октября 2011

Если я запускаю монго-запрос из оболочки с объяснением (), получаю имя используемого индекса, а затем снова запускаю тот же запрос, но с подсказкой (), указывающей тот же индекс, который будет использоваться - поле «миллис» изплан объяснения значительно уменьшен

например

подсказка не указана:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();

{
    "cursor" : "BtreeCursor my_super_index",
    "nscanned" : 599,
    "nscannedObjects" : 587,
    "n" : 3,
    "millis" : 24,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : { ... }
} 

подсказка предоставлена:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();

{
    "cursor" : "BtreeCursor my_super_index",
    "nscanned" : 599,
    "nscannedObjects" : 587,
    "n" : 3,
    "millis" : 2,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : { ... }
} 

Единственное отличие - "миллис"«field

Кто-нибудь знает, почему это так?

UPDATE:« Выбор используемого индекса »не объясняет этого, потому что Монго, насколько я знаю, выбирает индекс для каждого X(100?) Работает, поэтому он должен быть таким же быстрым, как с подсказкой, следующие (X-1) запуска

Ответы [ 4 ]

20 голосов
/ 21 февраля 2013

Mongo использует алгоритм, чтобы определить, какой индекс будет использоваться, если подсказка не указана, и затем кэширует индекс, используемый для аналогичного запроса для следующих 1000 вызовов

Но всякий раз, когда вы объясняете запрос на монго, он всегда запускает алгоритм выбора индекса, поэтому метод объяснения () с подсказкой всегда будет занимать меньше времени по сравнению с объяснением () без подсказки.

Подобный вопрос был дан ответ здесь Понимание Монго ДБ объяснить

6 голосов
/ 27 марта 2012

Монго выполнил один и тот же поиск оба раза, как вы можете видеть по количеству проверенных объектов.Также вы можете видеть, что используемый индекс был тем же самым (посмотрите на запись «курсора»), оба уже использовали ваш индекс my_super_index.

«подсказка» только указывает Mongo использовать тот конкретный индекс, который он ужеавтоматически выполняется в первом запросе.

Второй поиск был проще, поскольку все данные, вероятно, уже находились в кэше.

2 голосов
/ 21 августа 2012

Я изо всех сил пытался найти причину для того же самого.Я обнаружил, что когда у нас много индексов, монго действительно занимает больше времени, чем использование подсказок.Монго в основном занимает много времени, решая, какой индекс использовать.Подумайте о сценарии, где у вас есть 40 индексов, и вы делаете запрос.Первое, что нужно сделать Mongo, - какой индекс лучше всего подходит для конкретного запроса.Это подразумевает, что Mongo должен сканировать все ключи, а также выполнять некоторые вычисления при каждом сканировании, чтобы найти некоторый индекс производительности, если этот ключ используется.подсказка определенно ускорится, так как сканирование индексного ключа будет сохранено.

0 голосов
/ 22 апреля 2019

Я расскажу вам, как узнать, как это быстрее 1) без индекса. Он вытянет каждый документ в память, чтобы получить результат. 2) с индексом. Если у вас много индексов для этой коллекции, он будет брать индекс из кэша.память 3) с .hint (_index) Он примет тот конкретный индекс, который вы упомянули

с hint () без hint (), и тогда, когда вы делаете .explain ("executeStats") с помощью hint () вы можете проверить значение totalKeysExamined , которое будет соответствовать значению totalDocsExamined без подсказки (), которое вы можете увидеть totalKeysExamined значение больше, чем totalDocsExamined

totalDocsExamined этот результат будет идеально совпадать со счетом результатов большую часть времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...