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

複数のフィールドでの並べ替えmongoDB

    MongoDBクエリオプティマイザーは、さまざまなプランを試して、特定のクエリに最適なアプローチを決定することで機能します。そのクエリパターンの勝者プランは、次の約1,000クエリのために、またはexplain()を実行するまでキャッシュされます。 。

    考慮されたクエリプランを理解するには、explain(1)を使用する必要があります 例:

    db.col.find({category:'A'}).sort({updated: -1}).explain(1)
    

    allPlans 詳細には、比較されたすべての計画が表示されます。

    あまり選択的ではないクエリを実行する場合(たとえば、多くのレコードが{category: { $ne:'A'}}の基準に一致する場合 )、MongoDBは、インデックスと照合するよりも、BasicCursor(テーブルスキャン)を使用して結果を見つける方が速い場合があります。

    クエリのフィールドの順序 通常、インデックスの選択に違いはありません(範囲クエリにはいくつかの例外があります)。 ソートのフィールドの順序 インデックスの選択に影響します。 sort()の場合 基準がインデックスの順序と一致しない場合、インデックスを使用した後に結果データを再並べ替える必要があります(scanAndOrder:trueが表示されます)。 これが発生した場合は、Explain出力で)。

    また、MongoDBはクエリごとに1つのインデックスのみを使用することにも注意してください($orを除く) s)。

    したがって、クエリを最適化しようとしている場合:

    db.col.find({category:'A'}).sort({updated: -1, rating: -1})
    

    3つのフィールドすべてをインデックスに含める必要があります:

    db.col.ensureIndex({category: 1, updated: -1, rating: -1})
    

    参考までに、特定のクエリでインデックスを使用するように強制する場合(通常は不要または推奨)、hint()があります。 試すことができるオプション。



    1. MongoDB $ inクエリへの応答の順序は?

    2. MongoDBサービスがFedoraで実行されていません

    3. macOS10.12上の2つのDockerコンテナ間の通信

    4. MongoDBからDynamoDBへの移行、パート2