Исследование медленного запроса и индексов - PullRequest
1 голос
/ 06 января 2020

В журналах я обнаружил медленные запросы, но при запуске их вручную они выполняются быстро или, по крайней мере, учитывают индексы.
В журналах указывается, что часть запроса не использует индекс, который доступен.
При выполнении запроса учитывается индекс.
Запуск на AWS DocumentDB (который в основном совместим с MongoDB 3.6).
Логи говорят мне об этом (анонимные имена полей для интернетов ;-)):

{"op":"update",
"ts":1578041832906,
"ns":"collection",
"command":{
  "q":{"array.field1":{"$binary":"Hzy2Q0TBYEAWadeCtxpXuA==","$type":"3"}},
  "u":{"$set":{"array.$.field2":174}}},
  "nMatched":0,
  "nModified":0,
  "protocol":"op_query",
  "millis":694,
  "planSummary":"IXSCAN",
  "execStats":{
    "stage":"UPDATE",
    "nReturned":"0",
    "executionTimeMillisEstimate":"694.497",
    "inputStages":[{
      "stage":"LIMIT_SKIP",
      "nReturned":"0",
      "executionTimeMillisEstimate":"694.488",
      "inputStage":{
        "stage":"COLLSCAN",
        "nReturned":"0",
        "executionTimeMillisEstimate":"694.486"
      }
    },{
     "stage":"IXSCAN",
     "nReturned":"0",
     "executionTimeMillisEstimate":"694.492", 
     "indexName":"_idDocField3",
     "direction":"forward"
    }]
  },
}

При выполнении объяснения для этого обновления

collection.explain().update(
    {"array.field1": BinData(3, "Hzy2Q0TBYEAWadeCtxpXuA==")},
    {$set: {"array.$.field2":174}}
)

queryPlanner показывает мне это

{
  "queryPlanner": {
    "plannerVersion": 1,
    "namespace": "collection",
    "winningPlan": {
      "stage": "UPDATE",
      "inputStages": [
        {
          "stage": "LIMIT_SKIP",
          "inputStage": {
            "stage": "FETCH",
            "inputStage": {
              "stage": "IXSCAN",
              "indexName": "arrayField1"
            }
          }
        },
        {
          "stage": "IXSCAN",
          "indexName": "_idDocField3",
          "direction": "forward"
        }
      ]
    }
  },
  "serverInfo": {
    "host": "xxxxxxx",
    "port": 27017,
    "version": "3.6.0"
  },
  "ok": 1
}

Доступны следующие индексы:

  • _id_ { _id:1 }, ops: ~56,000,
  • _idDocField3 { _id: 1, docField3: 1 }, ops: ~4,200,000,
  • arrayField1 { "array.field1": 1 }, ops: ~400,
  • arrayField1DocField3 { "array.field1": 1, docField3: 1 }, ops: 0

array - массив, содержащий документ и идентификаторы UUID.
Размер коллекции составляет около 40 000 000.

И документы немного противоречивы:

https://docs.mongodb.com/v3.6/core/index-multikey/
Многопользовательские индексы не могут покрывать запросы над полями массива.

Однако, начиная с версии 3.6, индексы с несколькими ключами могут покрывать запросы к полям, не являющимся массивами, если индекс>> отслеживает, какие поля или поля приводят к тому, что индекс является мультиключевым. Многопользовательские индексы, созданные в> MongoDB 3.4 или более поздней версии в механизмах хранения, отличных от MMAPv1, отслеживают эти данные.

Может ли быть идея удалить составные индексы и полагаться на пересечение индексов?
Или переключить порядок составных индексов?
Кто-нибудь, кто может помочь мне оптимизировать это?

...