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

MongoDB複合インデックス-ソート順は重要ですか?

    MongoDBの単一フィールドインデックスは、ドキュメントの場所へのポインターを持つ配列と考えることができます。たとえば、次のようなコレクションがある場合(シーケンスが意図的に順序が狂っていることに注意してください):

    [collection]
    1: {a:3, b:2}
    2: {a:1, b:2}
    3: {a:2, b:1}
    4: {a:1, b:1}
    5: {a:2, b:2}
    

    単一フィールドインデックス

    今あなたがそうするなら:

    db.collection.createIndex({a:1})
    

    インデックスはおおよそ次のようになります:

    [index a:1]
    1: {a:1} --> 2, 4
    2: {a:2} --> 3, 5
    3: {a:3} --> 1
    

    3つの重要な点に注意してください:

    • aで並べ替えられます 昇順
    • 各エントリは、関連するドキュメントが存在する場所を指します
    • インデックスはaの値のみを記録します 分野。 b フィールドはインデックスにまったく存在しません

    したがって、次のようなクエリを実行すると、次のようになります。

    db.collection.find().sort({a:1})
    

    インデックスを上から下に移動し、エントリが指すドキュメントをフェッチして出力するだけです。インデックスを下から歩くこともできることに注意してください。例:

    db.collection.find().sort({a:-1})
    

    唯一の違いは、インデックスを逆方向に歩くことです。

    b はインデックスにまったく含まれていないため、bについてクエリを実行するときにインデックスを使用することはできません。 。

    複合インデックス

    複合インデックスの場合:

    db.collection.createIndex({a:1, b:1})
    

    aで並べ替えたいという意味です まず、bで並べ替えます 。インデックスは次のようになります:

    [index a:1, b:1]
    1: {a:1, b:1} --> 4
    2: {a:1, b:2} --> 2
    3: {a:2, b:1} --> 3
    4: {a:2, b:2} --> 5
    5: {a:3, b:2} --> 1
    

    注:

    • インデックスはaから並べ替えられます
    • a内 並べ替えられたb
    • インデックスエントリは5つありますが、前の単一フィールドの例では3つしかありません

    このインデックスを使用して、次のようなクエリを実行できます。

    db.collection.find({a:2}).sort({b:1})
    

    a:2の場所を簡単に見つけることができます 次に、インデックスを前方に歩きます。 そのインデックスを考えると、あなたはできません

    db.collection.find().sort({b:1})
    db.collection.find({b:1})
    

    どちらのクエリでも、bを簡単に見つけることはできません。 インデックス全体に分散しているため(つまり、連続したエントリではないため)。ただし、できます 行う:

    db.collection.find({a:2}).sort({b:-1})
    

    基本的にa:2の場所を見つけることができるからです であり、bを歩きます 後方へのエントリ。

    編集 :コメント内の@marcospgpの質問の明確化:

    インデックス{a:1, b:1}を使用する可能性 find({a:2}).sort({b:-1})を満たすため ソートされたテーブルの観点から見れば、実際には意味があります。たとえば、インデックス{a:1, b:1} 次のように考えることができます:

    a | b
    --|--
    1 | 1
    1 | 2
    2 | 1
    2 | 2
    2 | 3
    3 | 1
    3 | 2
    

    find({a:2})。sort({b:1})

    インデックス{a:1, b:1} sort by a, then within each a, sort the b valuesを意味します。 。次に、find({a:2}).sort({b:1})を実行すると 、インデックスはすべてのa=2がどこにあるかを知っています それは。 a=2のこのブロック内 、b (インデックス仕様に従って)昇順で並べ替えられるため、クエリfind({a:2}).sort({b:1}) 次の方法で満たすことができます:

    a | b
    --|--
    1 | 1
    1 | 2
    2 | 1 <-- walk this block forward to satisfy
    2 | 2 <-- find({a:2}).sort({b:1})
    2 | 3 <--
    3 | 1
    3 | 2
    

    find({a:2})。sort({b:-1})

    インデックスは前後に移動できるため、同様の手順に従いましたが、最後に少しひねりを加えました。

    a | b
    --|--
    1 | 1
    1 | 2
    2 | 1  <-- walk this block backward to satisfy
    2 | 2  <-- find({a:2}).sort({b:-1})
    2 | 3  <--
    3 | 1
    3 | 2
    

    インデックスを前後に移動できるという事実は、クエリfind({a:2}).sort({b:-1})を有効にする重要なポイントです。 インデックス{a:1, b:1}を使用できるようにする 。

    クエリプランナーの説明

    db.collection.explain().find(....)を使用すると、クエリプランナーが何を計画しているかを確認できます。 。基本的に、stageが表示された場合 COLLSCANの 、インデックスが使用されていないか、クエリに使用できます。 結果の説明 を参照してください コマンドの出力の詳細については。



    1. MongoDB-数値文字列のみを選択する方法/文字列がmongo-shellで数値かどうかを確認する

    2. 同じサーバー上のMongoDBシャードと構成サーバー?

    3. MongoDBのオブジェクト内で個別のキーを取得する方法

    4. redisを使用して、socket.ioおよびNodeJとのリアルタイムチャットを構築します