MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Pipeline agregado do MongoDB lento após a primeira etapa de correspondência


RESPOSTA DE 2019

Esta resposta é para o MongoDB 4.2

Depois de ler a pergunta e a discussão entre vocês, acredito que o problema foi resolvido, mas ainda a otimização é um problema comum para todos que estão usando o MongoDB.

Eu enfrentei o mesmo problema e aqui estão as dicas para otimização de consultas.

Corrija-me se eu estiver errado :)

1. Adicionar índice na coleção

Os índices desempenham um papel vital na execução rápida de consultas, pois os índices são estruturas de dados que podem armazenar o conjunto de dados da coleção em um formato fácil de percorrer. As consultas são executadas de forma eficiente com a ajuda de índices no MongoDB.

Você pode criar um tipo diferente de índices de acordo com sua necessidade. Saiba mais sobre índices aqui, a documentação oficial do MongoDB.

2. Otimização de pipeline
  • Sempre use $match antes de $project , pois os filtros removem documentos e campos extras do próximo estágio.
  • Lembre-se sempre, índices são usados ​​por $match e $sort . Portanto, tente adicionar um índice aos campos nos quais você classificará ou filtrará documentos.
  • Tente manter essa sequência em sua consulta, use $sort antes de $limit como $sort + $limit + $skip. Porque $sort aproveita o índice e permite que o MongoDB selecione o plano de consulta necessário durante a execução da consulta.
  • Sempre use $limit antes de $skip para que esse pulo seja aplicado para limitar os documentos.
  • Usar $project para retornar apenas os dados necessários na próxima etapa.

  • Sempre crie um índice nos atributos ForeignField em um $lookup . Além disso, como a pesquisa produz uma matriz, geralmente a desenrolamos no próximo estágio. Então, em vez de desenrolá-lo no próximo estágio, desenrole-o dentro da pesquisa como:
    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • Use allowDiskUse na agregação, com a ajuda dela, as operações de agregação podem gravar dados no subdiretório _tmp no diretório Database Path. Ele é usado para realizar a consulta grande no diretório temporário. Por exemplo:
     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

3. Reconstrua os índices

Se você estiver criando e excluindo índices com bastante frequência, reconstrua seus índices. Isso ajuda o MongoDB a atualizar, o plano de consulta armazenado anteriormente no cache, que continua assumindo o plano de consulta necessário, acredite, esse problema é péssimo :(

4. Remova índices indesejados

Muitos índices levam muito tempo na operação Criar, Atualizar e Excluir, pois eles precisam criar o índice junto com suas tarefas. Então, removê-los ajuda muito.

5. Limitando documentos

Em um cenário do mundo real, buscar dados completos presentes no banco de dados não ajuda. Além disso, você não pode exibi-lo ou o usuário não pode ler os dados obtidos completos. Portanto, em vez de buscar dados completos, busque dados em partes que ajudam você e seu cliente a observar esses dados.

E, por último, observar qual plano de execução é selecionado pelo MongoDB ajuda a descobrir o problema principal. Portanto, $explain o ajudará a descobrir isso.

Espero que este resumo ajude vocês, sintam-se à vontade para sugerir novos pontos se eu perder algum. Vou adicioná-los também.