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
の 、インデックスが使用されていないか、クエリに使用できます。 結果の説明
を参照してください コマンドの出力の詳細については。