我的查询看到了很长的执行时间。查询:
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
不是我们所希望的最快的操作吗?
答案 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
的日期