MongoDB覆盖索引不起作用

时间:2011-08-16 08:27:06

标签: mongodb covering-index

我有一个国家/地区的文档,如下所示:

{
  "_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 个答案:

答案 0 :(得分:2)

它不使用索引的原因是因为您没有查询任何条件。如果没有查找条件,查询优化器将不会选择要使用的索引,因此不能用作覆盖索引。

尝试db.countries.find({"names.en":"Rwanda"}, {"names.en":1, _id:0}).explain()验证使用索引条件,它实际上会达到相应的索引。

可以说明MongoDB需要足够聪明才能意识到它可以使用索引来满足原始查询,但目前却没有。您可以使用.sort({“names.en”:1})来选择索引。

答案 1 :(得分:0)

截至目前,您可以提示Mongo使用您想要的索引(ref):

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

我不确定何时添加此功能。

答案 2 :(得分:0)

使用排序将确保它将使用索引,仅限FOR SORTING。

将“查找”和“排序”视为两个独立的操作。