MongoDBは、何らかの方法で複合キーを連結し、それをBTreeのキーとして使用します。
単一のアイテムを見つける場合 -ツリー内のノードの順序は関係ありません。
ノードの範囲を返す場合 -互いに近い要素は、ツリーの同じ枝の下にあります。ノードが範囲内に近いほど、ノードをすばやく取得できます。
単一のフィールドインデックスを使用 -順序は関係ありません。昇順で接近している場合は、降順でも接近します。
複合キーをお持ちの場合 -順序が重要になり始めます。
たとえば、キーがA昇順B昇順の場合、インデックスは次のようになります。
Row A B 1 1 1 2 2 6 3 2 7 4 3 4 5 3 5 6 3 6 7 5 1
Aが昇順でBが降順のクエリは、行を返すためにインデックスを順不同でジャンプする必要があり、速度が低下します。たとえば、行1, 3, 2, 6, 5, 4, 7
を返します。
インデックスと同じ順序の範囲クエリは、行を正しい順序で順番に返すだけです。
BTreeでレコードを見つけるには、O(Log(n))時間がかかります。レコードの範囲を順番に見つけるのは、OLog(n)+ kのみです。ここで、kは返されるレコードの数です。
レコードが故障している場合、コストはOLog(n)* k
と同じくらい高くなる可能性があります。