Не работает индекс покрытия MongoDB - PullRequest
3 голосов
/ 16 августа 2011

У меня есть документ по странам, который выглядит так:

{
  "_id" : ObjectId("4e493af4140700590800154f"),
  "geoname_id" : "49518",
  "code" : "rw",
  "names" : {
    "en" : "Rwanda",
    "nl" : "Rwanda",
    "de" : "Ruanda"
  }
}

Чтобы коснуться индекса только при запросе:

db.countries.find({}, {"names.en":1, _id:0})

Я добавил следующий индекс:

db.countries.ensureIndex({"names.en":1})

Насколько я понимаю, запрос теперь должен касаться только индекса. Однако .explain () говорит мне, что запрос вообще не использует какой-либо индекс:

{
  "cursor" : "BasicCursor",
  "nscanned" : 247,
  "nscannedObjects" : 247,
  "n" : 247,
  "millis" : 0,
  "nYields" : 0,
  "nChunkSkips" : 0,
  "isMultiKey" : false,
  "indexOnly" : false,
  "indexBounds" : {
  }
}

Я думал, что причина может заключаться в том, что будет выведен полный дБ (247 стран) но это не имеет никакого смысла для меня. Когда страны доступны в индексе индекс должен быть использован, верно?

У кого-нибудь есть идея?

Приветствия

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Причина, по которой он не использует индекс, заключается в том, что вы не запрашиваете ни по одному критерию. Без критериев поиска оптимизатор запросов не выберет индекс для использования и поэтому не может функционировать как закрытый индекс.

Попробуйте db.countries.find({"names.en":"Rwanda"}, {"names.en":1, _id:0}).explain(), чтобы убедиться, что с индексированными критериями он действительно достигнет соответствующего индекса.

Можно привести пример того, что MongoDB должен быть достаточно умным, чтобы понять, что он может использовать индекс для удовлетворения исходного запроса, но в настоящее время это не так. Вы можете использовать .sort ({"names.en": 1}), чтобы он также выбирал индекс.

0 голосов
/ 28 апреля 2013

Использование сортировки гарантирует, что она будет использовать индекс, только ДЛЯ СОРТИРОВКИ.

Обрабатывать «поиск» и «сортировку» как две отдельные операции.

0 голосов
/ 19 февраля 2013

На данный момент вы можете намекнуть Mongo использовать нужный вам индекс ( ref ):

db.countries.find({}, {"names.en":1, _id:0}).hint({"names.en":1})

Хотя я не уверен, когда эта функция была добавлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...