MongoDB索引未被使用

9

我有一个按修改时间索引的问题集合。

{
  "v" : 1,
  "key" : {
      "modified" : 1
  },
  "name" : "modified_1",
  "ns" : "app23568387.questions",
  "background" : true,
  "safe" : null
}

但是,当我查询修改了字段的问题时,MongoDB并没有使用这个索引。

db.questions.find({modified: ISODate("2016-07-20T20:58:20.662Z")}).explain(true);

它返回

{
  "cursor" : "BasicCursor",
  "isMultiKey" : false,
  "n" : 0,
  "nscannedObjects" : 19315626,
  "nscanned" : 19315626,
  "nscannedObjectsAllPlans" : 19315626,
  "nscannedAllPlans" : 19315626,
  "scanAndOrder" : false,
  "indexOnly" : false,
  "nYields" : 384889,
  "nChunkSkips" : 0,
  "millis" : 43334,
  "allPlans" : [ 
      {
          "cursor" : "BasicCursor",
          "isMultiKey" : false,
          "n" : 0,
          "nscannedObjects" : 19315626,
          "nscanned" : 19315626,
          "scanAndOrder" : false,
          "indexOnly" : false,
          "nChunkSkips" : 0
      }
  ],
  "server" : "c387.candidate.37:10387",
  "filterSet" : false,
  "stats" : {
      "type" : "COLLSCAN",
      "works" : 19624020,
      "yields" : 384889,
      "unyields" : 384889,
      "invalidates" : 3,
      "advanced" : 0,
      "needTime" : 19315627,
      "needFetch" : 0,
      "isEOF" : 1,
      "docsTested" : 19315626,
      "children" : []
  }
}

当我使用 hint() 时,Mongo 抛出一个错误 bad hint。我有另一个文件夹的集合,它具有完全相同的索引,并且查询使用该索引(对于 explain() 返回 "cursor" : "BtreeCursor modified_1")。问题和文件夹之间可能有什么区别?即使 getIndexes() 返回索引,索引是否可能“损坏”?如果是这样,我该怎么办才能修复它?

1
你能否使用.explain("allPlansExecution")运行该查询,然后更新你的问题并附上整个执行计划输出。重要部分是所选计划和拒绝计划部分,因为它们将展示我们MongoDB为什么没有选择modified_1索引。此外,这句话:"当我使用hint()时,Mongo会抛出错误bad hint"表明你提供给hint()方法的名称不存在索引中。 - glytching
@glytching 我更新了问题,并附上了结果。(由于我们的db版本是2.6,所以我必须传递 true。) modified_1 不在 allPlans 中。这是否意味着即使在 getIndexes 中返回,该索引也不存在? - Satoko
@Satoko MongoDB 2.6已经被弃用超过2年了。请考虑至少升级到3.2版本,并查看问题是否仍然存在。 - felix
1个回答

2

2
那是一种可能性。在(1)“差提示”响应和(2)声称该索引由“getIndexes()”返回之间的不一致性强烈暗示索引创建过程存在问题。一个相关的建议:如果OP正在查询一个具有最终一致性的副本集,并且查询命中了一个辅助节点,则问题可能是该索引在辅助节点上构建失败了。 - glytching
是的,我之前一直在使用secondary来运行查询。我尝试在primary上使用explain(),它返回了"cursor" : "BtreeCursor modified_1"。后来primary和secondary被切换了,这导致索引被重新构建了(?). 现在两者都有并且使用索引来进行查询。谢谢。 - Satoko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接