2016-05-10 22 views
0

私のコレクションには6つのインデックスフィールドがあります。私のアプリは、さまざまな組み合わせの集約クエリを使用します。いくつかの例があります:MongoDBの複合インデックスの理解

1. {$match: {$and: [{field1: {$in: [1,2,3]}}, {$field5: {$gt: 8}}]}} 
2. {$match: {$and: [{field2: {$nin: [4,5,6]}}, {$field5: {$lte: 8}}, {$field6: 5}]}} 
3. {$match: {field1: {$in: [7,8,9]}}} 

前述のとおり、すべてのフィールドにインデックスが付けられています。私が初めてクエリを実行しているときに、の説明()関数は、1つのインデックスだけが使用されていることを通知します。クエリのフィールド数は、ユーザーの選択に依存します。 {field1:1、field2:1}、{field1:1、field2:1、field3:1}など)のインデックスのすべてを作成する必要がありますか、 {field1:1、field2:1、field3:1、field4:1、field5:1、field6:1}のようなすべてのフィールドの複合インデックス

6フィールドの組み合わせが非常に多いので、最初の決定はちょっと変わったと思います。

答えて

0

6つのフィールドのいずれかがクエリに含まれる場合は、シーマを変更し、個々のフィールドにキー/値のペアの配列を作成する代わりに変更できます。

{values: [n:"field1", v: "meerkat", n:"field2", value:"mongoose"] } 

すべてのフィールドをカバーする1つの複合インデックスを定義できます。

{"values.n": 1, "values.v": 1} 

あなたのクエリは次のようになります。あなたの第二の方法は、ソート順を動作しますが、変更されます

{ "values": { "$elemMatch" : { v:"field1", v:"meerkat" } } 
+0

ありがとうございます。一般的な問題は、私のアプリがフィールドのすべての組み合わせを使用しているということです。私のクエリには常にフィールドの組み合わせがないということです。 – vadimb

+0

その場合は、各フィールドを個別に索引付けすることをお勧めします。もちろん、これは書き込みパフォーマンスに影響します。あるいは、これらのフィールドにテキストデータが含まれている場合、すべてのフィールドにテキストインデックスを使用できます。 https://docs.mongodb.com/manual/core/index-text/#wildcard-text-indexes – Kiril

+0

別の提案を提供 – Kiril

0

。注意すべき

2つのこと:

  1. インデックスインデックスがクエリでスキャンしたすべてのフィールドが含まれている場合、クエリをサポートしています。クエリはコレクションではなくインデックスをスキャンします。クエリをサポートするインデックスを作成すると、クエリのパフォーマンスが大幅に向上します。

  2. 1つのキーのみでクエリを実行し、そのキーで別のキーと組み合わせてクエリを実行する場合は、単一キーインデックスを作成するよりも複合インデックスを作成するほうが効率的です。 MongoDBは両方のクエリに複合インデックスを使用します。複数のフィールド上の単一の複合インデックスは、それらのフィールドの「接頭辞」サブセットを検索するすべてのクエリをサポートできます。

例:

コレクションに次の索引:

{X 1、Y 1、Z 1} は、次のインデックスがサポートしているクエリをサポートすることができ:

{x:1} {x:1、y:1} プレフィックスインデックスがより良いクエリのパフォーマンス:たとえば、zが大きな配列の場合

{X 1、Y 1、Z:1}:{:Z、1:1×} また、{X

インデックスは、次のインデックスと同じクエリの多くをサポートすることができ:1、z:1}が追加使用されます。次のクエリを指定します。

db.collection.find({x:5}).sort({z:1}) {x:1、z:1}インデックスはクエリと並べ替え操作の両方をサポートします{x:1、y:1、z:1}インデックスはクエリのみをサポートします。並べ替えの詳細については、Use Indexes to Sort Query Resultsを参照してください。

基本例の複数のフィールドの並べ替えのために:

あなたは、インデックスのすべてのキー上またはサブセットの並べ替えを指定することができます。ただし、ソートキーは、索引に表示されているのと同じ順序でリストされていなければなりません。たとえば、インデックスキーパターン{a:1、b:1}は{a:1、b:1}ではソートをサポートできますが、{b:1、a:1}ではソートできません。

ソートに複合インデックスを使用するクエリでは、cursor.sort()ドキュメント内のすべてのキーの指定されたソート方向がインデックスキーパターンと一致するか、インデックスキーパターンの逆に一致する必要があります。たとえば、インデックスキーパターン{a:1、b:-1}は{a:1、b:-1}と{a:-1、b:1}のソートをサポートできますが、{a: 1、b:-1}または{a:1、b:1} Read this

関連する問題