Почему с помощью подсказки Mongo запрос выполняется в 10 раз быстрее?

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

например

нет подсказки:

>>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" : { ... }
} 

Единственная разница в том, что Поле "millis"

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

ОБНОВЛЕНИЕ: "Выбор индекса для использования" не объясняет этого, потому что mongo, насколько мне известно, выбирает индекс для каждого X (100?) запускается, поэтому он должен быть таким же быстрым, как с подсказкой следующий (X-1) запускается

21
задан Eugene Platonov 4 February 2013 в 17:01
поделиться