mongodb не использует индексы при сортировке? - PullRequest
13 голосов
/ 09 декабря 2011

У меня есть коллекция с этими индексами:

> 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,
...
}

какие-либо решения?

Ответы [ 2 ]

32 голосов
/ 09 декабря 2011

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

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

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

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

1 голос
/ 09 декабря 2011

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

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

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

...