提高IXSCAN的性能?

时间:2016-11-21 17:03:00

标签: mongodb performance

我的查询看到了很长的执行时间。查询:

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不是我们所希望的最快的操作吗?

2 个答案:

答案 0 :(得分:3)

explain输出没有多大帮助,因为查询中的日期与“1/1/2015”之类的字符串进行了比较,结果是0匹配。

由于你有两个范围过滤器,索引交集不起作用,所以mongo基本上使用1索引,提取文档,并应用第二个过滤器。它可能仍然适用于覆盖的查询,但尝试不带索引的查询可能更好:

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

即使它是COLLSCAN,它也使用COUNT阶段代替FETCH,这可能会更快。

答案 1 :(得分:0)

在新字段中存储日期ms并在其上应用过滤器。传递输入日期也转换为ms并应用过滤器。这应该做得更快。链接获取ms转换epochconverter

的日期