Монго-представление не показывает такое же улучшение скорости индексации, как в целевой коллекции - PullRequest
0 голосов
/ 26 апреля 2018

Я создал монго-представление, которое в основном предназначается для документов в коллекции «учетных записей» - особенно там, где значение для «Transactions.amount.balance» больше нуля. Так это выглядит так:

{"transactions.amounts.balance": { $gt : 0 }}

Теперь, поскольку результаты возвращались долго, я добавил индекс в это поле в коллекцию, с которой работает это представление. Впоследствии, когда я запускаю этот запрос к коллекции, результаты теперь возвращаются гораздо быстрее - менее чем за секунду, а не за 9 секунд до добавления индекса.

Однако, тем не менее, я, похоже, не замечаю того же улучшения производительности в созданном мной монго-представлении, которое, опять же, среди прочего, воссоздает этот же запрос в той же коллекции.

Насколько я понимаю, представление будет наследовать все индексы, созданные в целевой коллекции. Итак, если это так, почему я не вижу какого-либо улучшения производительности в представлении Монго? Я что-то упустил?

Кстати, когда я проверяю вход и выход каждого этапа моего конвейера агрегации, то, конечно, это тот, который возвращает около 9 секунд, чтобы вернуть результаты:

{ "transactions.amounts.balance" : { "$gt" : 0.0 } }

Почему этот шаг запроса, на мой взгляд, намного медленнее, чем когда он запускается непосредственно для целевого набора? Есть ли что-то еще, что я могу помочь ускорить выполнение этого шага запроса?

Вот первые несколько шагов конвейера агрегации в моем представлении Монго:

db.accounts.aggregate(

  // Pipeline
  [
    // Stage 1
    {
      $unwind: {
        "path": "$transactions"
      }
    },

    // Stage 2
    {
      $match: {
        "transactions.amounts.balance": {
          "$gt": 0.0
        }
      }
    },

    // Stage 3
    {
      $addFields: {
        "openBalance": "$transactions.amounts.balance"
      }
    }

1 Ответ

0 голосов
/ 26 апреля 2018

Согласно документации , $match будет использовать индекс только в том случае, если он используется без каких-либо других предыдущих этапов.

Если вы поместите $ match в самом начале конвейера, запрос может использовать индексы как любой другой db.collection.find () или db.collection.findOne ().

Поскольку вы сначала разматываете свои документы, $match не будет использовать индекс, который вы должны увидеть и в плане explain().

В зависимости от ваших данных, в частности, если у вас много документов, которые не содержат совпадающую запись в массиве transactions.amounts.balance, с точки зрения производительности может быть полезно просто продублировать фильтр $match и поместить его в самое начало вашего конвейера, чтобы исключить некоторые документы. В лучшем случае (опять же, это зависит от ваших данных), результирующее количество документов будет достаточно низким для второй стадии $match, чтобы больше не снижать производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...