回答:
MongoDBは、何らかの方法で複合キーを連結し、それをBTreeのキーとして使用します。
単一のアイテムを見つけるとき -ツリー内のノードの順序は関係ありません。
ノードの範囲を返す場合 -互いに近い要素は、ツリーの同じブランチの下にあります。ノードが範囲内に近ければ近いほど、ノードをすばやく取得できます。
単一のフィールドインデックスの場合 -順序は関係ありません。昇順で接近している場合は、降順でも接近しています。
複合キーがある場合 -順序が重要になります。
たとえば、キーがA昇順B昇順の場合、インデックスは次のようになります。
行AB 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と同じくらい高くなる可能性があります
簡単な答えあなたが探していることは、方向があることであるあなたが2つ以上のフィールドでソートされている場合にのみ重要。
並べ替える場合{a : 1, b : -1}
:
インデックス{a : 1, b : 1}
はインデックスよりも遅くなります{a : 1, b : -1}
{a: -1, b: -1}
、{a: -1, b: -1}
インデックスが{a: 1, b: 1}
あれば十分でしょうか?
{a: 1, b: 1}
、インデックスを完全に逆にすることで十分なので、インデックスで十分です。たとえば、インデックスオン{a: 1}
を使用して並べ替えを行うことができます。{a: -1}
2つの重要なポイントを理解します。
インデックスは無料ではありません。これらはメモリを消費し、挿入、更新、削除を行うときにパフォーマンスを低下させます。通常、パフォーマンスへの影響は無視できます(特に、読み取りパフォーマンスの向上と比較して)が、それは、インデックスの作成がうまくいかないことを意味するものではありません。
一緒にインデックスを作成する必要があるフィールドのグループを識別することは、実行しているクエリを理解することです。インデックスの作成に使用されるフィールドの順序は重要です。良いニュースは、順序を間違えた場合、インデックスはまったく使用されないため、説明を見つけるのが簡単になるということです。
クエリには並べ替えが必要な場合があります。ただし、並べ替えは負荷の高い操作になる可能性があるため、並べ替えの対象となるフィールドを、クエリを実行するフィールドと同じように扱うことが重要です。したがって、インデックスがある場合は高速になります。ただし、重要な違いが1つあります。並べ替えるフィールドは、インデックスの最後のフィールドでなければなりません。このルールの唯一の例外は、フィールドもクエリの一部である場合、最後の必須ルールは適用されません。
インデックスのすべてのキーまたはサブセットでソートを指定できます。ただし、ソートキーは、インデックスに表示されるのと同じ順序でリストする必要があります。たとえば、インデックスキーパターン{a:1、b:1}は、{a:1、b:1}の並べ替えをサポートできますが、{b:1、a:1}の並べ替えはサポートしません。
並べ替えは、すべてのキーに対して同じ並べ替え方向(昇順/降順)をインデックスキーパターンとして指定するか、すべてのキーに対して逆の並べ替え方向をインデックスキーパターンとして指定する必要があります。たとえば、インデックスキーパターン{a:1、b:1}は、{a:1、b:1}および{a:-1、b:-1}の並べ替えをサポートできますが、{a:-1の並べ替えはサポートしません。 、b:1}。
次のインデックスがあるとします。
{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
Example Index Used
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
いますが、インデックスがある場合、本当にインデックスが必要ですか{ a: 1}
、{ a: 1, b: 1}
またはインデックス{ a: 1, b: 1, c: 1 }
がすべてのケースをカバーしますか?クエリが常に同じ並べ替えを使用する場合:1クエリの並べ替えは-1ではありません
1, 3, 2, 6, 5, 4, 7
?