2017-02-16 45 views
0

如何檢查我的彙總查詢是好還是壞?我已經使用「解釋」,但它並不具體。如何檢查我的彙總查詢是好還是壞?

這裏是我的聚合「解釋」的輸出。

{ 
    "waitedMS" : NumberLong(0), 
    "stages" : [ 
      { 
        "$cursor" : { 
          "query" : { 
            "keys.license_id" : ObjectId("580eeb7fb79bec95648775a2"), 
            "deleted.status" : { 
              "$ne" : 1 
            } 
          }, 
          "queryPlanner" : { 
            "plannerVersion" : 1, 
            "namespace" : "serpentsmsapp.conversations", 
            "indexFilterSet" : false, 
            "parsedQuery" : { 
              "$and" : [ 
                { 
                  "keys.license_id" : { 
                    "$eq" : ObjectId("580eeb7fb79bec95648775a2") 
                  } 
                }, 
                { 
                  "$not" : { 
                    "deleted.status" : { 
                      "$eq" : 1 
                    } 
                  } 
                } 
              ] 
            }, 
            "winningPlan" : { 
              "stage" : "COLLSCAN", 
              "filter" : { 
                "$and" : [ 
                  { 
                    "keys.license_id" : { 
                      "$eq" : ObjectId("580eeb7fb79bec95648775a2") 
                    } 
                  }, 
                  { 
                    "$not" : { 
                      "deleted.status" : { 
                        "$eq" : 1 
                      } 
                    } 
                  } 
                ] 
              }, 
              "direction" : "forward" 
            }, 
            "rejectedPlans" : [ ] 
          } 
        } 
      }, 
      { 
        "$sort" : { 
          "sortKey" : { 
            "_id" : 1, 
            "keys.license_id" : 1, 
            "status.deleted" : 1 
          } 
        } 
      }, 
      { 
        "$lookup" : { 
          "from" : "conversation_messages", 
          "as" : "cmf", 
          "localField" : "_id", 
          "foreignField" : "keys.conv_id", 
          "unwinding" : { 
            "preserveNullAndEmptyArrays" : false 
          } 
        } 
      }, 
      { 
        "$match" : { 
          "cmf.deleted.status" : 0 
        } 
      }, 
      { 
        "$sort" : { 
          "sortKey" : { 
            "cmf.deleted.status" : -1 
          } 
        } 
      }, 
      { 
        "$group" : { 
          "_id" : { 
            "id" : "$_id", 
            "number" : "$number", 
            "mode" : "$mode", 
            "keys" : "$keys", 
            "ports" : "$ports", 
            "user_assign" : "$user_assign", 
            "spam" : "$spam" 
          }, 
          "cm_field" : { 
            "$last" : { 
              "id" : "$cmf._id", 
              "message" : "$cmf.message", 
              "ports" : "$cmf.ports", 
              "mode" : "$cmf.mode", 
              "keys" : "$cmf.keys", 
              "status" : "$cmf.status", 
              "date" : "$cmf.updated" 
            } 
          }, 
          "counts" : { 
            "$sum" : "$cmf.status" 
          }, 
          "sms_mode" : { 
            "$addToSet" : "$cmf.mode" 
          } 
        } 
      }, 
      { 
        "$sort" : { 
          "sortKey" : { 
            "cm_field.date" : -1 
          }, 
          "limit" : NumberLong(5000) 
        } 
      }, 
      { 
        "$group" : { 
          "_id" : "$_id", 
          "cm_field" : { 
            "$last" : "$cm_field" 
          }, 
          "counts" : { 
            "$first" : "$counts" 
          }, 
          "sms_mode" : { 
            "$first" : "$sms_mode" 
          } 
        } 
      } 
    ], 
    "ok" : 1 

}

我怎麼能看到多少文檔執行我的查詢之前被掃描?

回答

1

爲了解決你的問題,我建議你下面的計劃

  1. 學習如何做Explain工作。
  2. 「好或壞」方法不是一種工程方法,它總是取決於很多因素(需求,硬件等)。如果查詢性能夠好,您應該在回答之前定義這些要求。

對於您的具體解釋日誌。 "COLSCAN" - 意味着它已經使用收集中的所有文檔來彙總結果,這通常是一個警告標誌,您應該考慮使用正確的indexes