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

mongodbで複合インデックスを構築する方法

    1つの投稿にたくさんの質問があります;)実際的な順序でそれらを見ていきましょう:

    • すべてのクエリで使用できるインデックスは最大で1つです(最上位の$または句などを除く)。これにはすべての並べ替えが含まれます。
    • 上記の理由により、フィールドごとのインデックスではなく、問題の複合インデックスが必ず必要になります。
    • カーディナリティの低いフィールド(つまり、データセット全体で一意の値が非常に少ないフィールド)は、選択性が非常に限られているため、通常はインデックスに含めないでください。
    • 複合インデックスのフィールドの順序が重要であり、複合インデックスの各フィールドの相対的な方向も重要です(例: "{name:1、age:-1}")。 mongodb.orgには、複合インデックスとインデックスフィールドの方向に関するドキュメントがたくさんあるので、ここですべてを繰り返すことはしません。
    • ソートは、ソートフィールドがインデックス内にあり、結果セットの選択に使用された最後のフィールドの直後のインデックス内のフィールドである場合にのみ、インデックスを使用します。ほとんどの場合、これがインデックスの最後のフィールドになります。

    したがって、インデックスウォークでカーディナリティの高いフィールドに基づいてドキュメントの大部分が削除されると、ほとんどの場合、ステータスインデックスによって最適化されることはほとんどないため、最大で2〜3のドキュメントが残るため、インデックスにステータスを含めないでください。 (特に、これらの2〜3のドキュメントは、とにかく同じステータスになる可能性が非常に高いとおっしゃっていたので)

    さて、あなたの場合に関連する最後の注意は、範囲クエリを使用するとき(そしてあなたがそうするとき)、とにかくソートにインデックスを使用しないということです。クエリをテストしたら、explain()の「scanAndOrder」値を確認することでこれを確認できます。その値が存在し、trueの場合、インデックスを直接使用するのではなく、結果セットをメモリ内で並べ替える(スキャンと順序付け)ことを意味します。特定のケースではこれを回避することはできません。

    したがって、インデックスは次のようになります:

    db.posts.ensureIndex({start:1, end:1})
    

    クエリ(わかりやすくするために順序を変更しました。クエリオプティマイザは元のクエリを同じ実行パスで実行しますが、インデックス付きフィールドを最初に順番に配置することをお勧めします):

    db.posts.find({start: {$lt: today}, end: {$gt: today}, status: {$gte:0}}).sort({sortOrder:1})
    



    1. C ++ Redisモジュールの作成-RedisModule_OnLoad()シンボルをエクスポートしません

    2. MongoDBのデータベースインデックス作成の概要

    3. NoSQLデータベースの戦い-MongoDBとCouchDBの比較

    4. MapReduceのHadoopリデューサークラスとは何ですか?