2016-06-17 3 views
1

私は以下のように3つのフィールドを持つコレクションを作成します。その後、2番目のフィールドにインデックスを作成し、並べ替えとヒント操作を使用して検索を実行しました。MongoDB sort winingplanがヒントをオーバーライド

なぜ - 以前に作成されたヒントオーバーインデックスを使用しても - MongoDBはソートプランとしてソートを設定しましたか?

私はいくつかの基準と並べ替えでデータをフィルタリングすれば、結果はより良いかもしれないと思いますか?

コレクション

> db.values.find() 
{ "_id" : ObjectId("5763ffebe5a81f569b1005e5"), "field1" : "A", "field2" : "B", "field3" : "C" } 

インデックス

> db.values.getIndexes() 
    [ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "name" : "_id_", 
     "ns" : "peftest.values" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "field2" : 1 
     }, 
     "name" : "field2_1", 
     "ns" : "peftest.values" 
    } 
    ] 

クエリと

> db.values.find({field2:"B"}).sort({field1:1}).hint({field2:1}).explain() 
{ 
    "queryPlanner" : { 
     "plannerVersion" : 1, 
     "namespace" : "peftest.values", 
     "indexFilterSet" : false, 
     "parsedQuery" : { 
      "field2" : { 
       "$eq" : "B" 
      } 
     }, 
     "winningPlan" : { 
      "stage" : "SORT", 
      "sortPattern" : { 
       "field1" : 1 
      }, 
      "inputStage" : { 
       "stage" : "SORT_KEY_GENERATOR", 
       "inputStage" : { 
        "stage" : "FETCH", 
        "inputStage" : { 
         "stage" : "IXSCAN", 
         "keyPattern" : { 
          "field2" : 1 
         }, 
         "indexName" : "field2_1", 
         "isMultiKey" : false, 
         "isUnique" : false, 
         "isSparse" : false, 
         "isPartial" : false, 
         "indexVersion" : 1, 
         "direction" : "forward", 
         "indexBounds" : { 
          "field2" : [ 
           "[\"B\", \"B\"]" 
          ] 
         } 
        } 
       } 
      } 
     }, 
     "rejectedPlans" : [ ] 
    }, 
    "serverInfo" : { 
     "host" : "apstrd14501d.intraservice.corp", 
     "port" : 27017, 
     "version" : "3.2.4", 
     "gitVersion" : "e2ee9ffcf9f5a94fad76802e28cc978718bb7a30" 
    }, 
    "ok" : 1 
} 
+0

inputStageは、正しいインデックス* {"stage": "IXSCAN"、 "keyPattern":{"field2":1}、...} *を使用してデータをフェッチしたと言います。 – joao

答えて

2

を説明し、私は計画は何だと思いますよあなたは間違った視点からそれを見ています。 ソートの入力段階はインデックススキャンなので、クエリプランは最初にインデックスを使用し、結果データをソートに渡します。

関連する問題