127

ドキュメントを引用するには:

インデックスを作成するとき、キーに関連付けられた番号はインデックスの方向を指定するため、常に 1 (昇順) または -1 (降順) にする必要があります。単一キー インデックスまたはランダム アクセス検索の場合、方向は重要ではありませんが、複合インデックスで並べ替えまたは範囲クエリを実行する場合は重要です。

ただし、複合インデックスでインデックスの方向が問題になる理由はわかりません。誰かがさらに説明(または例)を提供できますか?

4

3 に答える 3

124

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 降順のクエリは、行を返すために順不同でインデックスをジャンプする必要があり、遅くなります。たとえば、Row を返します。1, 3, 2, 6, 5, 4, 7

インデックスと同じ順序の範囲クエリは、正しい順序で行を順番に返すだけです。

BTree でレコードを検索するには、O(Log(n)) 時間かかります。レコードの範囲を順番に見つけるのは、OLog(n) + k だけです。ここで、k は返されるレコードの数です。

レコードが順不同の場合、コストは OLog(n) * k と同じくらい高くなる可能性があります

于 2012-04-26T09:07:53.640 に答える
48

あなたが探している簡単な答えは、2 つ以上のフィールドで並べ替える場合にのみ方向が重要になるということです。

ソートする場合{a : 1, b : -1}:

インデックス{a : 1, b : 1}はインデックスより遅くなります{a : 1, b : -1}

于 2012-05-28T15:11:51.783 に答える
16

なぜインデックス

2つの重要なポイントを理解してください。

  1. インデックスはインデックスがないよりはましですが、正しいインデックスはどちらよりもはるかに優れています。
  2. MongoDB はクエリごとに 1 つのインデックスのみを使用し、適切なフィールド順序で複合インデックスを作成します。おそらく使用したいものです。

インデックスは無料ではありません。これらはメモリを消費し、挿入、更新、および削除を行うときにパフォーマンスが低下します。通常、パフォーマンスへの影響は無視できますが (特に読み取りパフォーマンスの向上と比較すると)、インデックスの作成が賢明でないという意味ではありません。

インデックスの方法

一緒にインデックスを作成する必要があるフィールドのグループを特定することは、実行しているクエリを理解することです。インデックスの作成に使用されるフィールドの順序は重要です。良いニュースは、順序を間違えるとインデックスがまったく使用されないため、explain で簡単に見つけられることです。

ソートする理由

クエリには並べ替えが必要な場合があります。ただし、並べ替えはコストのかかる操作になる可能性があるため、並べ替え対象のフィールドをクエリ対象のフィールドと同じように扱うことが重要です。したがって、インデックスがあれば高速になります。ただし、重要な違いが 1 つあります。並べ替えるフィールドは、インデックスの最後のフィールドでなければなりません。このルールの唯一の例外は、フィールドがクエリの一部でもある場合、must-be-last ルールは適用されません。

並べ替え方法

インデックスのすべてのキーまたはサブセットに対してソートを指定できます。ただし、並べ替えキーは、インデックスに表示される順序と同じ順序でリストする必要があります。たとえば、インデックス キー パターン { 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 }
于 2016-08-11T18:42:48.107 に答える