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

mongoクエリを高速化する方法

    ここでできることがいくつかあります:

    まず、$またはの代わりに$inを使用します。

    次に、MongoDBはのみ 最初の一致にはインデックスを使用するため、2つの一致のどちらが優れているかを(試して)判断する必要があります。目標は、クエリを高速化し、パイプラインを通過するドキュメントを少なくすることです。そのためには、次のことを行います。

    まず、3つのインデックスを作成します。

    db.element.ensureIndex( { 'versions.branch' : 1 } );
    db.element.ensureIndex( { 'doctype' : 1 } );
    db.element.ensureIndex( { 'prefix' : 1 } );
    

    次に、次の3つのクエリを実行して、「cursor」、「n」、「nScanned」、および「ms」フィールドに注目してください。

    branch = "nameofbranch"; // guessing here
    db.element.find( "versions.branch": branch ).explain();
    db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
    db.element.find( "prefix": { $ne: "500" } ).explain();
    

    最後のクエリでは、$ neクエリはインデックスを使用できないため、「cursor」は「BasicCursor」であることに注意してください。

    他の2つには、「ms」、「n」、「nScanned」のさまざまな値が表示されます。 「ms」は、クエリの実行にかかった時間です。これがほぼ同じである場合は、「n」と「nScanned」の値の違いを確認してください。 「versions.branch」クエリの違いは0であると予想し、推測します。「doctype」クエリの場合は異なる可能性があります。「ms」がほぼ同じでない場合は、最速の$matchを入力します。最初は集約パイプラインの$match句として。

    速度( "ms")が両方とも同じである場合は、"n"の値を確認してください。 「prefix」クエリの「n」が「5」で、「versions.branch」クエリの「n」が「500」の場合、「prefix」クエリの結果はより少なく、より良いことを意味します。ドキュメントが返されます。その場合は、それを最初の$match句としてまとめて配置します。 「versions.branch」がはるかに少ない場合は、それを最初の$match句として使用します。




    1. SpringデータMongoDb:MappingMongoConverter remove _class

    2. GeoJSONポリゴンをMongoDBに保存する

    3. MongoDBの一意のインデックスの利点

    4. Mongodbタイプの参照ノード