У меня составной _id, содержащий 3 числовых свойства:
_id ": {
"KeyA": 0,
"KeyB": 0,
"KeyC": 0
}
В рассматриваемой базе данных есть 2 миллиона идентичных значений для KeyA и кластеры из 500 000 идентичных значений для KeyB.
Насколько я понимаю, я могу эффективно запрашивать KeyA и KeyB, используя команду:
find( { "_id.KeyA" : 1, "_id.KeyB": 3 } ).limit(100)
Когда я объясняю этот запрос, результат будет:
"cursor" : "BasicCursor",
"nscanned" : 1000100,
"nscannedObjects" : 1000100,
"n" : 100,
"millis" : 1592,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
Без лимита () результат:
"cursor" : "BasicCursor",
"nscanned" : 2000000,
"nscannedObjects" : 2000000,
"n" : 500000,
"millis" : 3181,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {}
Насколько я понимаю, BasicCursor означает, что индекс был проигнорирован, и оба запроса имеют большое время выполнения - даже когда я запрашивал только 100 записей, это занимает ~ 1,5 секунды. Я собирался использовать ограничение для нумерации страниц, но это, очевидно, слишком медленно.
Команда:
find( { "_id.KeyA" : 1, "_id.KeyB": 3, , "_id.KeyC": 1000 } )
Правильно использует BtreeCursor и выполняет быстро, указывая, что составной _id верен.
Я использую релиз 1.8.3 MongoDb. Может ли кто-нибудь уточнить, вижу ли я ожидаемое поведение или неправильно понял, как использовать / запросить составной индекс?
Спасибо,
Пол.