2

8GBのLinuxマシンでmongodbを実行しています。現在、テストモードになっているため、他のリクエストがあったとしてもごくわずかです。

100万件のドキュメントが含まれるコレクションアイテムがあります。フィールドにインデックスを作成しています:PeerGroupとCategoryIds(マルチキーで生成される3〜6個の要素の配列)db.items.ensureIndex({PeerGroup:1, CategoryIds:1}:。

クエリを実行しているとき

db.items.find({"CategoryIds" : new BinData(3,"xqScEqwPiEOjQg7tzs6PHA=="), "PeerGroup" : "anonymous"}).explain()

次の結果が得られました。

{
    "cursor" : "BtreeCursor PeerGroup_1_CategoryIds_1",
    "isMultiKey" : true,
    "n" : 203944,
    "nscannedObjects" : 203944,
    "nscanned" : 203944,
    "nscannedObjectsAllPlans" : 203944,
    "nscannedAllPlans" : 203944,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 1,
    "nChunkSkips" : 0,
    "millis" : 680,
    "indexBounds" : {
            "PeerGroup" : [
                    [
                            "anonymous",
                            "anonymous"
                    ]
            ],
            "CategoryIds" : [
                    [
                            BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
                            BinData(3,"BXzpwVQozECLaPkJy26t6Q==")
                    ]
            ]
    },
    "server" : "db02:27017"

}

680msはそれほど速くないと思います。それともこれは受け入れられますか?また、なぜ「indexOnly:false」と表示されるのですか?

4

1 に答える 1

5

680msはそれほど速くないと思います。それともこれは受け入れられますか?

その種類は、これらのオブジェクトの大きさと、これが最初の実行であったかどうかによって異なります。返すデータセット全体(インデックスを含む)がメモリに収まると仮定すると、次にこれを実行すると、メモリ内クエリになり、基本的に可能な限り高速に返されます。nscannedは高いため、このクエリはあまり選択的ではありません。ほとんどのレコードは、PeerGroupで「匿名」の値を持ちますか?その場合、CategoryIdの方が選択的である場合は、{CategoryIds:1, PeerGroup:1}代わりにインデックスを試してみてください(hint()を使用して一方を他方に対して試してください)。

また、なぜ「indexOnly:false」と表示されるのですか?

これは単に、返したいすべてのフィールドがインデックスに含まれていないBtreeCursorことを示し、インデックスがクエリに使用されたことを示します(BasicCursorはインデックスが使用されなかったことを意味します)。これをクエリにするには、プロジェクションindexOnlyのインデックス内の2つのフィールド(つまり、:)のみを返す必要があります。つまり、データ自体に触れる必要がなく、インデックスだけから必要なものすべてを返すことができるということです。{_id : 0, PeerGroup:1, CategoryIds:1}

于 2012-09-01T12:40:10.067 に答える