sql >> データベース >  >> NoSQL >> MongoDB

MongoDBの異なるクエリプランが異なるnReturned値を表示するのはなぜですか?

    これは、allPlansExecutionモード> ドキュメントページ。言い換えると:

    プランの選択中に、クエリを満たすことができるインデックスが複数ある場合、MongoDBはすべての有効なプランを使用して試行を実行し、どのプランが最適であるかを判断します。 クエリプラン を参照してください このプロセスの詳細については。

    MongoDB 3.4.6の時点で、プランの選択には、「レース」で候補プランを並行して実行し、どの候補プランが最初に101の結果を返すかを確認することが含まれます。上記の例では、勝ったプランがレースで101の結果を返すまでに、負けたプランは2つの結果しか管理しませんでした。その後、勝利した計画が実行されて完了します。これが、負けたプランにnReturned: 2のみが表示される理由です。 統計で。

    この「競合」が実行されるのは、同じように見えるプランが2つある場合、JSONドキュメントの柔軟性のためにMongoDBは特定のクエリに最適なプランを認識しないためです(たとえば、テーブルの構造がわかっているSQLとは異なります)。 。もちろん、MongoDBが誤って推測し、経験的なプロセスであるため、パフォーマンスの低い計画になってしまう可能性は十分にあります。このため、MongoDBが推測する必要がないように、クエリをサポートするインデックスを作成することをお勧めします。それ以外の場合は、hint()を使用できます 特定のクエリに使用するインデックスをMongoDBに指示します。

    したがって:

    • 当選プランの統計は、実際のクエリの結果統計です。
    • 失われたプランの統計には、クエリプランの試用実行の統計のみが表示されます。
    • プランの選択には、101件の結果に対する「レース」の実行が含まれます。このレースは、クエリを満たすことができるインデックスが複数ある場合にのみ実行されます。

    注1 :あなたが見た2つの計画はどちらも素晴らしいものではありませんでした。優勝プランは"nReturned" : 43を示しています 、"totalKeysExamined" : 221 、および"totalDocsExamined" : 219 。つまり、MongoDBは219個のドキュメントを調べて、そのうち43個を返すだけで済みます。効率はわずか20% 。理想的には、nReturnedが必要です。 totalDocsExaminedに等しい数 。

    注2 :複合インデックスを作成してみてください{'rack_name': 1, 'timestamp': 1} 。同じクエリで、より良い効率の数値を取得する必要があります。

    注3allPlansExecution以降に注意してください 指定された、すべて 統計は完全を期すためにMongoDBから適切に返されますが、最終的なnReturnedには何の関係もありません。 結果。それは拒否された計画であり、nReturned: 2 番号できます 混乱する。 executionStatsを使用する場合、この統計は表示されません 設定。主に、allPlansExecution 一部の計画が拒否される理由を微調整および決定するために使用されます。




    1. Ubuntuにmongodb-clientsの最新バージョンをインストールするにはどうすればよいですか?

    2. 集約フレームワークの対象インデックスの作成

    3. マングースで重複するドキュメントを確認するにはどうすればよいですか?

    4. mongo C#ドライバーを使用して、カスタムオブジェクトの配列をシリアル化して保存するにはどうすればよいですか?