2016-03-23 8 views
0

複合インデックスの基本的な概念を理解するのに困っています。 のは、私はこのスキーマでコレクションを持っているとしましょう:{ field1: 1, field: 2}、唯一field1に、両方のfield1 AND field2にこのメイクセンスをクエリをサポートします:https://docs.mongodb.org/manual/core/index-compound/MongoDBコンパウンドインデックスパフォーマンス

{ 
    _id: 1, 
    field1: 'aaa', 
    field2: 'bbb', 
    field3: 'ccc' 
} 

このインデックスがあること、それは非常に明確に述べている、と私は理解しています。

ここで、フィールド1が常に使用されているすべてのフィールド(1,2,3)でクエリをサポートしたいのですが? にfield1 AND field2field1 AND field3を照会するオプションをサポートしたいと思います。

これらのクエリオプションのそれぞれに対して複合インデックスを作成することは可能ですが、同じパフォーマンスでクエリする化合物を少なくできるかどうかが問題です。例えば

私は、インデックスがあれば、:{field1: 1, field2: 1, field3: 1}を、私はfield1 AND field3を照会、それはこのインデックスを使用しますが、field2のインデックス境界は"[MinKey, MaxKey]"になります。 別のインデックスを作成する価値はありますか:{field1: 1, field3: 1}

+0

[explian](https:// docs。 '{field1:1、field3:1}'の索引の有無にかかわらず、これら2つの結果を比較すると、それはあなたにいくつかの手がかりを与えるでしょう。 – zangw

+0

@zangw私はそれを行ったので、それは '[MinKey、MaxKey]'のインデックス境界でインデックスを使用することを知っている理由です。しかし、それは私にパフォーマンス評価を与えません – TomG

答えて

0

これらのドキュメントとインデックスを含むコレクションを作成しようとすると、クエリで説明を実行すると、mongoはインデックス:{field1: 1, field3: 1}を選択し、他のプランを拒否します。これは、mongoが他のインデックスよりも1つのインデックスを優先することを示しています。

たとえば、次のリターンを説明します。

"winningPlan" : { 
    "stage" : "FETCH", 
    "inputStage" : { 
     "stage" : "IXSCAN", 
     "keyPattern" : { 
      "field1" : 1, 
      "field3" : 1 
     }, 
     "indexName" : "field1_1_field3_1", 
     "isMultiKey" : false, 
     "isUnique" : false, 
     "isSparse" : false, 
     "isPartial" : false, 
     "indexVersion" : 1, 
     "direction" : "forward", 
     "indexBounds" : { 
      "field1" : [ 
       "[\"aaa\", \"aaa\"]" 
      ], 
      "field3" : [ 
       "[\"ccc\", \"ccc\"]" 
      ] 
     } 
    } 
}, 
"rejectedPlans" : [ 
    { 
     "stage" : "FETCH", 
     "filter" : { 
      "field3" : { 
       "$eq" : "ccc" 
      } 
     }, 
     "inputStage" : { 
      "stage" : "IXSCAN", 
      "keyPattern" : { 
       "field1" : 1, 
       "field2" : 1 
      }, 
      "indexName" : "field1_1_field2_1", 
      "isMultiKey" : false, 
      "isUnique" : false, 
      "isSparse" : false, 
      "isPartial" : false, 
      "indexVersion" : 1, 
      "direction" : "forward", 
      "indexBounds" : { 
       "field1" : [ 
        "[\"aaa\", \"aaa\"]" 
       ], 
       "field2" : [ 
        "[MinKey, MaxKey]" 
       ] 
      } 
     } 
    }, 
    { 
     "stage" : "FETCH", 
     "inputStage" : { 
      "stage" : "IXSCAN", 
      "keyPattern" : { 
       "field1" : 1, 
       "field2" : 1, 
       "field3" : 1 
      }, 
      "indexName" : "field1_1_field2_1_field3_1", 
      "isMultiKey" : false, 
      "isUnique" : false, 
      "isSparse" : false, 
      "isPartial" : false, 
      "indexVersion" : 1, 
      "direction" : "forward", 
      "indexBounds" : { 
       "field1" : [ 
        "[\"aaa\", \"aaa\"]" 
       ], 
       "field2" : [ 
        "[MinKey, MaxKey]" 
       ], 
       "field3" : [ 
        "[\"ccc\", \"ccc\"]" 
       ] 
      } 
     } 
    } 
] 

は、しかし、インデックスサイズの問題があり、すべてのインデックスかどうかは、データベースのワーキングセットと一緒にRAMに収まる作成することでしょう。それらがいなければ、ディスク上のインデックスを保持します。これは、読み込みがかなり遅くなります。最高の妥協点は、3つのフィールドすべてでインデックスを使用することです。なぜなら、これはインデックスよりも優れており、3つのインデックスよりメンテナンスが少ないからです。

+0

方程式のRAMを残して、私はこれら2つのパフォーマンスの賢明さの違いは何かを知ることに興味があります。私はこの指数が他の指数よりも好まれていると理解していますが、それに見合う価値がありますか – TomG