入力データが単一の値で、コレクション データに最小/最大範囲が含まれている場合、Mongo でデータを検索する最も効率的な方法は何ですか? 例えば:
record = { min: number, max: number, payload }
レコードの最小/最大範囲内にある数値のレコードを見つける必要があります。範囲が交差することはありません。範囲のサイズに関する予測可能性はありません。
コレクションには最大 600 万件のレコードが含まれています。範囲を展開すると (範囲内の各値のレコードがある場合)、代わりに約 4B のレコードが表示されます。
の複合インデックスを作成しましたが、{min:1,max:1}
次を使用して検索しようとしました:
db.block.find({min:{$lte:value},max:{$gte:value})
... 数秒から数十秒かかります。以下は、explain()
およびの出力ですgetIndexes()
。検索を大幅に高速化するために適用できるトリックはありますか?
NJmongo:PRIMARY> db.block.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "mispot.block",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"min" : 1,
"max" : 1
},
"ns" : "mispot.block",
"name" : "min_1_max_1"
}
]
NJmongo:PRIMARY> db.block.find({max:{$gte:1135194602},min:{$lte:1135194602}}).explain()
{
"cursor" : "BtreeCursor min_1_max_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1199049,
"nscannedObjectsAllPlans" : 1199050,
"nscannedAllPlans" : 2398098,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 7534,
"nChunkSkips" : 0,
"millis" : 5060,
"indexBounds" : {
"min" : [
[
-1.7976931348623157e+308,
1135194602
]
],
"max" : [
[
1135194602,
1.7976931348623157e+308
]
]
},
"server" : "ccc:27017"
}