22

Explain()を使用してシェルからmongoクエリを実行する場合、使用するインデックスの名前を取得してから同じクエリを再度実行しますが、hint()を使用して、使用する同じインデックスを指定します-explainplanの"millis"フィールドは大幅に減少

例えば

ヒントは提供されていません:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain();

{
    "cursor" : "BtreeCursor my_super_index",
    "nscanned" : 599,
    "nscannedObjects" : 587,
    "n" : 3,
    "millis" : 24,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : { ... }
} 

提供されるヒント:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain();

{
    "cursor" : "BtreeCursor my_super_index",
    "nscanned" : 599,
    "nscannedObjects" : 587,
    "n" : 3,
    "millis" : 2,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : { ... }
} 

唯一の違いは「ミリス」フィールドです

なぜそれなのか誰か知っていますか?

更新:「使用するインデックスの選択」では説明されていません。mongoは、私が知る限り、X(100?)の実行ごとにインデックスを選択するため、次のヒント(X-1)と同じくらい高速である必要があります。実行します

4

4 に答える 4

27

Mongo はアルゴリズムを使用して、ヒントが提供されない場合に使用するインデックスを決定し、次の 1000 回の呼び出しのために同様のクエリに使用されるインデックスをキャッシュします。

ただし、mongo クエリを説明するたびに、常にインデックス選択アルゴリズムが実行されるため、ヒント付きの Explain() は、ヒントなしの Explain() と比較して常に時間がかかりません。

同様の質問がここで回答されました mongo dbの説明を理解する

于 2013-02-21T11:22:22.740 に答える
6

スキャンされたオブジェクトの数からわかるように、Mongo は両方の回で同じ検索を行いました。また、使用されたインデックスが同じであることがわかります (「カーソル」エントリを見てください)。どちらもすでに my_super_index インデックスを使用しています。

「ヒント」は、最初のクエリで既に自動的に実行されている特定のインデックスを使用するように Mongo に指示するだけです。

2 番目の検索は、おそらくすべてのデータが既にキャッシュにあるため、単純で高速でした。

于 2012-03-27T19:28:31.210 に答える