Проблемы с географическими индексами в mongodb - PullRequest
0 голосов
/ 08 марта 2019

У нас есть коллекция ~ 1M элементов, которые мы запрашиваем с помощью селектора $nearSphere. Для возврата 200 предметов требуется от 3 до 20 секунд. Из плана объяснения запроса мы видим, что этот индекс проходит 6 раз.

Это ожидаемое поведение планировщика запросов mongodb?

Мы хотели бы знать, есть ли способ заставить монго сначала фильтровать по некоторому полю, например endDate, чтобы уменьшить набор, а затем использовать $nearSphere?

В нашей системе мониторинга мы можем видеть некоторые ошибки страниц и утверждать, но они могут быть связаны с отсутствием IOPS нашего жесткого диска.

Спасибо за вашу помощь.

Вот план объяснения (я удалил отклоненные планы и пометил строки BinData)

{
  "queryPlanner": {
    "plannerVersion": 1.0,
    "namespace": "myCollection.Post",
    "indexFilterSet": false,
    "parsedQuery": {
      "$and": [
        {
          "$or": [
            {
              "availableToUsers": {
                "$eq": "M76zJCedq4"
              }
            },
            {
              "$nor": [
                {
                  "availableToUsers": {
                    "$exists": true
                  }
                }
              ]
            }
          ]
        },
        {
          "startDate": {
            "$lt": ISODate(
            "2019-03-01T01:02:00.000+0000"
            )
          }
        },
        {
          "availableSubmitNumber": {
            "$gt": 0.0
          }
        },
        {
          "endDate": {
            "$gt": ISODate(
            "2019-03-01T01:02:00.000+0000"
            )
          }
        },
        {
          "name": {
            "$in": ["Post1", "Post2"]
          }
        },
        {
          "$nor": [
            {
              "acceptedByUserId": {
                "$eq": "M76zJCedq4"
              }
            }
          ]
        },
        {
          "locationGeoPoint": {
            "$nearSphere": [
              174.9084055,
              -36.9293289
            ]
          }
        }
      ]
    },
    "winningPlan": {
      "stage": "FETCH",
      "filter": {
        "$and": [
          {
            "$or": [
              {
                "availableToUsers": {
                  "$eq": "M76zJCedq4"
                }
              },
              {
                "$nor": [
                  {
                    "availableToUsers": {
                      "$exists": true
                    }
                  }
                ]
              }
            ]
          },
          {
            "$nor": [
              {
                "acceptedByUserId": {
                  "$eq": "M76zJCedq4"
                }
              }
            ]
          }
        ]
      },
      "inputStage": {
        "stage": "GEO_NEAR_2D",
        "keyPattern": {
          "locationGeoPoint": "2d",
          "endDate": 1.0,
          "startDate": 1.0,
          "availableSubmitNumber": 1.0,
          "name": 1.0
        },
        "indexName": "locationGeoPoint_2d_endDate_1_startDate_1_availableSubmitNumber_1_name_1",
        "indexVersion": 2.0,
        "inputStages": [
          {
            "stage": "FETCH",
            "inputStage": {
              "stage": "IXSCAN",
              "filter": {
                "$and": [
                  {
                    "endDate": {
                      "$gt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "startDate": {
                      "$lt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "availableSubmitNumber": {
                      "$gt": 0.0
                    }
                  },
                  {
                    "name": {
                      "$in": ["Post1", "Post2"]
                    }
                  }
                ]
              },
              "keyPattern": {
                "locationGeoPoint": "2d",
                "endDate": 1.0,
                "startDate": 1.0,
                "availableSubmitNumber": 1.0,
                "name": 1.0
              },
              "indexName": "locationGeoPoint_2d_endDate_1_startDate_1_availableSubmitNumber_1_name_1",
              "isMultiKey": false,
              "isUnique": false,
              "isSparse": false,
              "isPartial": false,
              "indexVersion": 2.0,
              "direction": "forward",
              "indexBounds": {
                "locationGeoPoint": [
                  "[BinData(128, BEB167B000000000), BinData(128, BEB167BFFFFFFFFF)]"
                ],
                "endDate": [
                  "[MinKey, MaxKey]"
                ],
                "startDate": [
                  "[MinKey, MaxKey]"
                ],
                "availableSubmitNumber": [
                  "[MinKey, MaxKey]"
                ],
                "name": [
                  "[MinKey, MaxKey]"
                ]
              }
            }
          },
          {
            "stage": "FETCH",
            "inputStage": {
              "stage": "IXSCAN",
              "filter": {
                "$and": [
                  {
                    "endDate": {
                      "$gt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "startDate": {
                      "$lt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "availableSubmitNumber": {
                      "$gt": 0.0
                    }
                  },
                  {
                    "name": {
                      "$in": ["Post1", "Post2"]
                    }
                  }
                ]
              },
              "keyPattern": {
                "locationGeoPoint": "2d",
                "endDate": 1.0,
                "startDate": 1.0,
                "availableSubmitNumber": 1.0,
                "name": 1.0
              },
              "indexName": "locationGeoPoint_2d_endDate_1_startDate_1_availableSubmitNumber_1_name_1",
              "isMultiKey": false,
              "isUnique": false,
              "isSparse": false,
              "isPartial": false,
              "indexVersion": 2.0,
              "direction": "forward",
              "indexBounds": {
                "locationGeoPoint": [
                  "[BinData(128, BEB1658000000000), BinData(128, BEB165BFFFFFFFFF)]",
                  "[BinData(128, BEB165C000000000), BinData(128, BEB165FFFFFFFFFF)]"
                ],
                "endDate": [
                  "[MinKey, MaxKey]"
                ],
                "startDate": [
                  "[MinKey, MaxKey]"
                ],
                "availableSubmitNumber": [
                  "[MinKey, MaxKey]"
                ],
                "name": [
                  "[MinKey, MaxKey]"
                ]
              }
            }
          },
          {
            "stage": "FETCH",
            "inputStage": {
              "stage": "IXSCAN",
              "filter": {
                "$and": [
                  {
                    "endDate": {
                      "$gt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "startDate": {
                      "$lt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "availableSubmitNumber": {
                      "$gt": 0.0
                    }
                  },
                  {
                    "name": {
                      "$in": ["Post1", "Post2"]
                    }
                  }
                ]
              },
              "keyPattern": {
                "locationGeoPoint": "2d",
                "endDate": 1.0,
                "startDate": 1.0,
                "availableSubmitNumber": 1.0,
                "name": 1.0
              },
              "indexName": "locationGeoPoint_2d_endDate_1_startDate_1_availableSubmitNumber_1_name_1",
              "isMultiKey": false,
              "isUnique": false,
              "isSparse": false,
              "isPartial": false,
              "indexVersion": 2.0,
              "direction": "forward",
              "indexBounds": {
                "locationGeoPoint": [
                  "[BinData(128, BEB14BC000000000), BinData(128, BEB14BFFFFFFFFFF)]",
                  "[BinData(128, BEB14C0000000000), BinData(128, BEB14FFFFFFFFFFF)]",
                  "[BinData(128, BEB1580000000000), BinData(128, BEB15BFFFFFFFFFF)]",
                  "[BinData(128, BEB1600000000000), BinData(128, BEB163FFFFFFFFFF)]",
                  "[BinData(128, BEB1640000000000), BinData(128, BEB164FFFFFFFFFF)]",
                  "[BinData(128, BEB1650000000000), BinData(128, BEB1653FFFFFFFFF)]",
                  "[BinData(128, BEB1654000000000), BinData(128, BEB1657FFFFFFFFF)]",
                  "[BinData(128, BEB1680000000000), BinData(128, BEB16BFFFFFFFFFF)]"
                ],
                "endDate": [
                  "[MinKey, MaxKey]"
                ],
                "startDate": [
                  "[MinKey, MaxKey]"
                ],
                "availableSubmitNumber": [
                  "[MinKey, MaxKey]"
                ],
                "name": [
                  "[MinKey, MaxKey]"
                ]
              }
            }
          },
          {
            "stage": "FETCH",
            "inputStage": {
              "stage": "IXSCAN",
              "filter": {
                "$and": [
                  {
                    "endDate": {
                      "$gt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "startDate": {
                      "$lt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "availableSubmitNumber": {
                      "$gt": 0.0
                    }
                  },
                  {
                    "name": {
                      "$in": ["Post1", "Post2"]
                    }
                  }
                ]
              },
              "keyPattern": {
                "locationGeoPoint": "2d",
                "endDate": 1.0,
                "startDate": 1.0,
                "availableSubmitNumber": 1.0,
                "name": 1.0
              },
              "indexName": "locationGeoPoint_2d_endDate_1_startDate_1_availableSubmitNumber_1_name_1",
              "isMultiKey": false,
              "isUnique": false,
              "isSparse": false,
              "isPartial": false,
              "indexVersion": 2.0,
              "direction": "forward",
              "indexBounds": {
                "locationGeoPoint": [
                  "[BinData(128, BE9BE00000000000), BinData(128, BE9BEFFFFFFFFFFF)]",
                  "[BinData(128, BE9BF80000000000), BinData(128, BE9BFBFFFFFFFFFF)]",
                  "[BinData(128, BEB1100000000000), BinData(128, BEB11FFFFFFFFFFF)]",
                  "[BinData(128, BEB1300000000000), BinData(128, BEB13FFFFFFFFFFF)]",
                  "[BinData(128, BEB1400000000000), BinData(128, BEB143FFFFFFFFFF)]"
                ],
                "endDate": [
                  "[MinKey, MaxKey]"
                ],
                "startDate": [
                  "[MinKey, MaxKey]"
                ],
                "availableSubmitNumber": [
                  "[MinKey, MaxKey]"
                ],
                "name": [
                  "[MinKey, MaxKey]"
                ]
              }
            }
          },
          {
            "stage": "FETCH",
            "inputStage": {
              "stage": "IXSCAN",
              "filter": {
                "$and": [
                  {
                    "endDate": {
                      "$gt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "startDate": {
                      "$lt": ISODate(
                      "2019-03-01T01:02:00.000+0000"
                      )
                    }
                  },
                  {
                    "availableSubmitNumber": {
                      "$gt": 0.0
                    }
                  },
                  {
                    "name": {
                      "$in": ["Post1", "Post2"]
                    }
                  }
                ]
              },
              "keyPattern": {
                "locationGeoPoint": "2d",
                "endDate": 1.0,
                "startDate": 1.0,
                "availableSubmitNumber": 1.0,
                "name": 1.0
              },
              "indexName": "locationGeoPoint_2d_endDate_1_startDate_1_availableSubmitNumber_1_name_1",
              "isMultiKey": false,
              "isUnique": false,
              "isSparse": false,
              "isPartial": false,
              "indexVersion": 2.0,
              "direction": "forward",
              "indexBounds": {
                "locationGeoPoint": [
                  "[BinData(128, BE9B800000000000), BinData(128, BE9BBFFFFFFFFFFF)]",
                  "[BinData(128, BE9BC00000000000), BinData(128, BE9BCFFFFFFFFFFF)]"
                ],
                "endDate": [
                  "[MinKey, MaxKey]"
                ],
                "startDate": [
                  "[MinKey, MaxKey]"
                ],
                "availableSubmitNumber": [
                  "[MinKey, MaxKey]"
                ],
                "name": [
                  "[MinKey, MaxKey]"
                ]
              }
            }
          }
        ]
      }
    }
  },
  "serverInfo": {
    "port": 27017.0,
    "version": "4.0.3",
    "gitVersion": "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"
  },
  "ok": 1.0,
  "operationTime": Timestamp(1551940718,
  4),
  "$clusterTime": {
    "clusterTime": Timestamp(1551940718,
    4),
    "signature": {
      "hash": BinData(0,
      "AAAAAAAAAAAAAAAAAAAAAAAAAAA="
      ),
      "keyId": NumberLong(0)
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...