我有一個超過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