我有一个超过500万个项目的MondoDB集合。每个项目都有一个包含整数值的“开始”和“结束”字段。搜索MongoDB中两个项目字段之间的值的记录
项目没有重叠的开始和结束。
例如这将是无效:
{start:100, end:200}
{start:150, end:250}
我试图找到其中一个给定的值是开始和结束
start <= VALUE <= end
下面的查询工作之间的项目,但它需要5至15秒返回
db.blocks.find({ "start" : { $lt : 3232235521 }, "end" :{ $gt : 3232235521 }}).limit(1);
我已经添加了测试以下指标用很少的改善
db.blocks.ensureIndex({start:1});
db.blocks.ensureIndex({end:1});
//also a compounded one
db.blocks.ensureIndex({start:1,end:1});
**在查询结果中编辑**
解释的结果():
> db.blocks.find({ "start" : { $lt : 3232235521 }, "end" :{ $gt : 3232235521 }}).limit(1).explain();
{
"cursor" : "BtreeCursor end_1",
"nscanned" : 1160982,
"nscannedObjects" : 1160982,
"n" : 0,
"millis" : 5779,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"end" : [
[
3232235521,
1.7976931348623157e+308
]
]
}
}
什么将加速这一特定查询了最好的方法呢?
您是否尝试运行explain命令以查看查询的nscanned编号?这可能是因为你的查询标准是为''start'找到合格的文件,然后找到'end',反之亦然。 Btw是固定的间隔,例如0-99,100-199?或变量? – DhruvPathak
我认为你的东西.. nscanned是巨大的(添加到问题)。间隔不固定,它们是可变的。 – SuitedSloth