2017-02-02 11 views
1

私は断片化されたレプリカセットを使用しています。以下のインデックスを持つ1つの大きなコレクションを持っている:Mongo 3.4はこのクエリにインデックスを使用しているかどうかを確認しますか?

{ 
    "shop" : 1, 
    "email" : 1 
} 

私は1つによって、各要素1を照会する最善の方法を見つけようとしている:

db.user.explain('executionStats').find({shop:151, email:{$exists:true}}, {limit:1})) 

と結果は次の通りです。

私の質問は次のとおりです。 インデックスはインデックスを使用していますか? はいの場合、どうすればの説明の結果を読むことができますか?

セカンド: 照会その後、このクエリ、ループカーソルを使用した方がよい再び

.find({店:151、Eメール:{$が存在する:真}}、{制限を:100} ))

又は

.findOne({店:151、メールは:{$が存在する:真}}))

は連続ループですか?

{ 
"queryPlanner" : { 
    "plannerVersion" : NumberInt(1), 
    "namespace" : "vt4users.user", 
    "indexFilterSet" : false, 
    "parsedQuery" : { 
     "$and" : [ 
      { 
       "shop" : { 
        "$eq" : NumberInt(151) 
       } 
      }, 
      { 
       "email" : { 
        "$exists" : true 
       } 
      } 
     ] 
    }, 
    "winningPlan" : { 
     "stage" : "PROJECTION", 
     "transformBy" : { 
      "limit" : NumberInt(1) 
     }, 
     "inputStage" : { 
      "stage" : "FETCH", 
      "filter" : { 
       "email" : { 
        "$exists" : true 
       } 
      }, 
      "inputStage" : { 
       "stage" : "IXSCAN", 
       "keyPattern" : { 
        "shop" : NumberInt(1), 
        "email" : NumberInt(1) 
       }, 
       "indexName" : "shop_1_email_1", 
       "isMultiKey" : false, 
       "isUnique" : false, 
       "isSparse" : true, 
       "isPartial" : false, 
       "indexVersion" : NumberInt(1), 
       "direction" : "forward", 
       "indexBounds" : { 
        "shop" : [ 
         "[151.0, 151.0]" 
        ], 
        "email" : [ 
         "[MinKey, MaxKey]" 
        ] 
       } 
      } 
     } 
    }, 
    "rejectedPlans" : [ 

    ] 
}, 
"executionStats" : { 
    "executionSuccess" : true, 
    "nReturned" : NumberInt(3), 
    "executionTimeMillis" : NumberInt(0), 
    "totalKeysExamined" : NumberInt(3), 
    "totalDocsExamined" : NumberInt(3), 
    "executionStages" : { 
     "stage" : "PROJECTION", 
     "nReturned" : NumberInt(3), 
     "executionTimeMillisEstimate" : NumberInt(0), 
     "works" : NumberInt(4), 
     "advanced" : NumberInt(3), 
     "needTime" : NumberInt(0), 
     "needYield" : NumberInt(0), 
     "saveState" : NumberInt(0), 
     "restoreState" : NumberInt(0), 
     "isEOF" : NumberInt(1), 
     "invalidates" : NumberInt(0), 
     "transformBy" : { 
      "limit" : NumberInt(1) 
     }, 
     "inputStage" : { 
      "stage" : "FETCH", 
      "filter" : { 
       "email" : { 
        "$exists" : true 
       } 
      }, 
      "nReturned" : NumberInt(3), 
      "executionTimeMillisEstimate" : NumberInt(0), 
      "works" : NumberInt(4), 
      "advanced" : NumberInt(3), 
      "needTime" : NumberInt(0), 
      "needYield" : NumberInt(0), 
      "saveState" : NumberInt(0), 
      "restoreState" : NumberInt(0), 
      "isEOF" : NumberInt(1), 
      "invalidates" : NumberInt(0), 
      "docsExamined" : NumberInt(3), 
      "alreadyHasObj" : NumberInt(0), 
      "inputStage" : { 
       "stage" : "IXSCAN", 
       "nReturned" : NumberInt(3), 
       "executionTimeMillisEstimate" : NumberInt(0), 
       "works" : NumberInt(4), 
       "advanced" : NumberInt(3), 
       "needTime" : NumberInt(0), 
       "needYield" : NumberInt(0), 
       "saveState" : NumberInt(0), 
       "restoreState" : NumberInt(0), 
       "isEOF" : NumberInt(1), 
       "invalidates" : NumberInt(0), 
       "keyPattern" : { 
        "shop" : NumberInt(1), 
        "email" : NumberInt(1) 
       }, 
       "indexName" : "shop_1_email_1", 
       "isMultiKey" : false, 
       "isUnique" : false, 
       "isSparse" : true, 
       "isPartial" : false, 
       "indexVersion" : NumberInt(1), 
       "direction" : "forward", 
       "indexBounds" : { 
        "shop" : [ 
         "[151.0, 151.0]" 
        ], 
        "email" : [ 
         "[MinKey, MaxKey]" 
        ] 
       }, 
       "keysExamined" : NumberInt(3), 
       "dupsTested" : NumberInt(0), 
       "dupsDropped" : NumberInt(0), 
       "seenInvalidated" : NumberInt(0) 
      } 
     } 
    } 
}, 
"serverInfo" : { 
    "host" : "host", 
    "port" : NumberInt(27017), 
    "version" : "3.2.11", 
    "gitVersion" : "009580ad490190ba33d1c6253ebd8d91808923e4" 
}, 
"ok" : NumberInt(1) 

}

+0

質問タイトルのように3.2ではなく3.4を使用しています。しかし、それは問題ではありません。 –

答えて

1

あなたのクエリがインデックスを使用しています。あなたは、あなたがより良い、その意味を理解することができますcheck it in the docsinputStage

"stage" : "IXSCAN" 

でそれを見ることができます。

2つ目の質問について、すべての結果を取得する場合は、通常はクエリを実行するよりも、findOneを使用してループするほうがパフォーマンスが向上します。

+0

確かに、私は地元のmongoからコピーしました。とにかく問題ではありません。 –

+0

実際、find_oneの代わりにlimitを使ってフェッチすることになりました –

関連する問題