2017-02-16 1 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.

Смежные вопросы