我有一个查询看到一些相当长的执行时间。查询:

db.legs.find(
  {
    effectiveDate: {$lte: startDate},
    discontinuedDate: {$gte: startDate}
  }
).count()

下面是我日志中的输出:
2016-11-21T08:58:50.470-0800 I COMMAND  [conn2] command myDB.legs
command: count { count: "legs", query: { effectiveDate: { $lte: new Date(1412121600000) }, discontinuedDate: { $gte: new Date(1412121600000) } }, fields: {} }
planSummary: IXSCAN { discontinuedDate: 1 } keyUpdates:0 writeConflicts:0 numYields:82575 reslen:47 locks:{ Global: { acquireCount: { r: 165152 } }, MMAPV1Journal: { acquireCount: { r: 82576 } }, Database: { acquireCount: { r: 82576 } }, Collection: { acquireCount: { R: 82576 } } } protocol:op_command 13940ms

我在{effectiveDate: 1, discontinuedDate: 1}上有一个索引,它使用IXSCAN来获取数据。我想知道是否有人可以建议加快这个查询的速度?在这种情况下,IXSCAN不是我们所希望的最快的行动吗?

最佳答案

explain输出没有多大帮助,因为查询中的日期与“1/1/2015”之类的字符串进行了比较,结果是0个匹配项。
由于有两个范围过滤器,索引交集不起作用,所以mongo基本上使用1个索引,获取文档,然后应用第二个过滤器。它可能仍然适用于覆盖的查询,但最好尝试不带索引的查询:

db.legs.find({
    effectiveDate: {$lte: startDate},
    discontinuedDate: {$gte: startDate}
})
.hint({$natural:true})
.count()

即使使用collscan,它也使用count stage而不是fetch,这可能更快。

10-04 20:53