Подтвердить что ты не робот

Mongodb не использует индексы при сортировке?

i имеет набор с этими индексами:

> db.message.getIndexKeys()
[
    {
        "_id" : 1
    },
    {
        "msgid" : 1
    },
    {
        "keywords" : 1,
        "msgid" : 1
    }
]

и запрос типа

db.message.find({'keywords': {'$all': ['apple', 'banana']}}).limit(30).explain()

отлично работает с индексом

{
    "cursor" : "BtreeCursor keywords_1_msgid_1",    
    "nscanned" : 96,
    "nscannedObjects" : 96,
    ...
}

но при сортировке с помощью msgid:

db.message.find({'keywords': {'$all': ['apple', 'banana']}})
    .sort({msgid:-1})
    .limit(30).explain()

mongodb больше не использует индексы:

{
"cursor" : "BtreeCursor msgid_1 reverse",
"nscanned" : 1784455,
"nscannedObjects" : 1784455,
...
}

любые решения?

4b9b3361

Ответ 1

На самом деле Mongo использует индекс (который вы можете сказать, увидев BtreeCursor в объяснении), просто не составной.

Важно помнить, что направление имеет значение, если у вас есть составной индекс.

Попробуйте: db.ensureIndex({ keywords: 1, msg_id: -1 })

Mongo предпочитает использовать индекс msg_id в обратном порядке в вашем примере, потому что он быстрее извлекает результаты в отсортированном порядке и затем сопоставляется в O (n) времени, чем соответствует результатам, а затем сортирует в O (nlogn) время.

Ответ 2

Использует индекс - индекс на msgid. MongoDB выбирает индекс для использования для запроса, используя все возможные индексы и используя тот, который заканчивается первым. Этот результат кэшируется для 1000 запросов или до тех пор, пока не будет сделано определенное количество изменений в коллекции (изменения данных, новые индексы и т.д.).

Вы можете увидеть все планы запросов, пробовав прохождение true до explain().

Подробнее см. http://www.mongodb.org/display/DOCS/Query+Optimizer.