2

入力データが単一の値で、コレクション データに最小/最大範囲が含まれている場合、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"
}
4

1 に答える 1

1

レコードの範囲がblock重複しない場合は、次の方法でこれをはるかに高速に実行できます。

db.block.find({min:{$lte:value}}).sort({min:-1}).limit(1)

このクエリは、インデックス内の単純なルックアップでレコードを見つけることができるため、ほぼ瞬時に返されます。

マージする必要がある何百万ものレコードで 2 つの句がそれぞれ一致するため、実行中のクエリは低速です。実際、複合インデックスの一部は指定されたものにしか使用できないため、個別のインデックスをオンにするminと、特定の.maxmaxminmax

于 2013-04-20T05:33:19.770 に答える