ms-dred
@ms-dred
Вечно что то не то и что то не так...

Почему сортировка в MongoDB занимает много времени?

Выполнение банального запроса занимает кучу времени именно с сортировкой
К примеру у меня есть обычный поиск по сайту
Collect.aggregate([
  {
    $match: { $text: { $search: "слово" }, type: "document", public: { $gte: 4 } }
  }, {
    $skip: 0
  }, {
    $limit: 10
  }
]).explain("executionStats")

Выполняет он очень быстро executionTimeMillis: 3

Если у запросу добавить сортировку то все сразу меняется
Collect.aggregate([
  {
    $match: { $text: { $search: "слово" }, type: "document", public: { $gte: 4 } }
  },{
    $sort: { createdAt: -1 } 
  },{
    $skip: 0
  }, {
    $limit: 10
  }
]).explain("executionStats")


executionTimeMillis: 764

Вот полный explain запроса

{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'base.col',
    indexFilterSet: false,
    parsedQuery: { '$and': [Array] },
    queryHash: 'C43CE0C3',
    planCacheKey: 'B90460FD',
    optimizedPipeline: true,
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'SORT',
      sortPattern: [Object],
      memLimit: 104857600,
      limitAmount: 10,
      type: 'simple',
      inputStage: [Object]
    },
    rejectedPlans: []
  },
  executionStats: {
    executionSuccess: true,
    nReturned: 10,
    executionTimeMillis: 764,
    totalKeysExamined: 160214,
    totalDocsExamined: 147266,
    executionStages: {
      stage: 'SORT',
      nReturned: 10,
      executionTimeMillisEstimate: 359,
      works: 160226,
      advanced: 10,
      needTime: 160215,
      needYield: 0,
      saveState: 160,
      restoreState: 160,
      isEOF: 1,
      sortPattern: [Object],
      memLimit: 104857600,
      limitAmount: 10,
      type: 'simple',
      totalDataSizeSorted: 712574,
      usedDisk: false,
      spills: 0,
      inputStage: [Object]
    }
  },
  command: {
    aggregate: 'col',
    pipeline: [ [Object], [Object], [Object], [Object] ],
    cursor: {},
    '$db': 'base'
  },
  serverInfo: {
    host: 'MongoDB',
    port: 27017,
    version: '6.0.5',
    gitVersion: 'c9a99c120371d4d4c52cbb15dac3hgjk8d3b1d'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 104857600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 104857600,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600
  },
  ok: 1
}



Имеются так же индексы
{ v: 2, key: { public: 1 }, name: 'public_1', background: true },
{
    v: 2,
    key: { createdAt: 1 },
    name: 'createdAt_1',
    background: true
  },
 { v: 2, key: { type: 1 }, name: 'type_1', background: true },
{
    v: 2,
    key: { _fts: 'text', _ftsx: 1, catalog: 1, type: 1, public: 1 },
    name: 'subscribe_text_catalog_1_type_1_public_1',
    weights: { subscribe: 1 },
    default_language: 'russian',
    language_override: 'language',
    textIndexVersion: 3
  },
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Kano
Потому что бд не смогла выбрать индекс. Попробуйте сменить направление у индекса createdAt_1 или явно в запросе укажите что хотите использовать индекс subscribe_text_catalog_1_type_1_public_1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы