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,
...
}
любые решения?
Ответы
Ответ 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.