Медленный агрегат Монго при использовании $ sort и $ limit в $ facet - PullRequest
0 голосов
/ 09 февраля 2019

Я замечаю огромные различия в производительности в том, что кажется одинаковым, по крайней мере, концептуально.Тесты были выполнены на простой структуре коллекции, которая имеет _id, имя и созданный At, но их там 20 миллионов.Есть указатель на созданный Ат.Он размещен на кластере mlab, версия 3.6.9 WiredTiger.

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

db.getCollection("runnablecalls").aggregate([
         {
          $facet: {
            docs: [
                { $sort:  {createdAt: -1} },
                { $limit:  25 },
                { $skip:  0 },                                
            ],
            page_info: [
              { $group: { _id: null, total: { $sum: 1 } } 
              }
            ],
          }
        }                           
      ])

Это занимает почти 40s.Теперь, если я переместил $sort и $limit за пределы фасета, это займет 0.042s.

db.getCollection("runnablecalls").aggregate([
        { $sort:  {createdAt: -1} },
        { $limit:  25 }, 
        {
          $facet: {
            docs: [           
                { $skip:  0 },                
            ],            
            page_info: [
                { 
                  $group: { _id: null, total: { $sum: 1 } } 
                } 
            ]}
        },                           
      ])

Фасет page_info не имеет значения в конце, я могу вынуть его без разницы, я просто оставляю его, потому что мне нравится его использовать.Я знаю, как решить проблему, используя два запроса: счетчик и агрегат без $facet.Мне просто нравится понимать, почему это происходит.

1 Ответ

0 голосов
/ 11 февраля 2019

Первая агрегация не использует индекс.Вторая агрегация использует индекс и фильтрует первые 25 документов, прежде чем ввести $facet.Вы можете добавить explain('executionStats'), чтобы увидеть планы запросов и использование индексов.Например,

db.getCollection("runnablecalls").explain('executionStats').aggregate([
         {
          $facet: {
            docs: [
                { $sort:  {createdAt: -1} },
                { $limit:  25 },
                { $skip:  0 },                                
            ],
            page_info: [
              { $group: { _id: null, total: { $sum: 1 } } 
              }
            ],
          }
        }                           
      ])
...