AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 198444
Accepted
Alireza
Alireza
Asked: 2018-02-22 00:24:03 +0800 CST2018-02-22 00:24:03 +0800 CST 2018-02-22 00:24:03 +0800 CST

Como a projeção do mongoDB afeta o desempenho?

  • 772

Da MongoDBdocumentação é mencionado que:

Quando você precisa apenas de um subconjunto de campos de documentos, pode obter melhor desempenho retornando apenas os campos necessários

Como os campos de filtragem afetam o desempenho? O desempenho está relacionado ao tamanho dos dados que são transmitidos pela rede? ou o tamanho dos dados que serão mantidos na memória? Como exatamente esse desempenho é melhorado? Qual é esse desempenho que está sendo mencionado na documentação?

Eu tenho consultas lentas do MongoDB. O retorno de um subconjunto afeta minha consulta lenta (tenho índice composto no campo)?

mongodb projection
  • 2 2 respostas
  • 13096 Views

2 respostas

  • Voted
  1. Best Answer
    Stennie
    2018-02-22T06:50:58+08:002018-02-22T06:50:58+08:00

    Por padrão, as consultas retornam todos os campos nos documentos correspondentes. Se você precisar de todos os campos, retornar documentos completos será mais eficiente do que fazer com que o servidor manipule o conjunto de resultados com critérios de projeção.

    No entanto, usar a projeção para limitar os campos a serem retornados dos resultados da consulta pode melhorar o desempenho:

    • removendo campos desnecessários dos resultados da consulta (economizando na largura de banda da rede)
    • limitando os campos de resultado para obter uma consulta coberta (retornando resultados de consulta indexados sem buscar documentos completos)

    Ao usar a projeção para remover campos não utilizados, o servidor MongoDB terá que buscar cada documento completo na memória (se ainda não estiver lá) e filtrar os resultados a serem retornados. Esse uso de projeção não reduz o uso de memória ou conjunto de trabalho no servidor MongoDB, mas pode economizar largura de banda de rede significativa para resultados de consulta, dependendo do modelo de dados e dos campos projetados.

    Uma consulta coberta é um caso especial em que todos os campos solicitados em um resultado de consulta são incluídos no índice usado, para que o servidor não precise buscar o documento completo. As consultas cobertas podem melhorar o desempenho (evitando a busca de documentos) e o uso de memória (se outras consultas não exigirem a busca do mesmo documento).

    Exemplos

    Para fins de demonstração através do mongoshell, imagine que você tenha um documento parecido com este:

    db.data.insert({
        a: 'webscale',
        b: new Array(10*1024*1024).join('z')
    })
    

    O campo bpode representar uma seleção de valores (ou, neste caso, uma string muito longa).

    Em seguida, crie um índice no {a:1}qual é um campo comumente usado consultado pelo seu caso de uso:

    db.data.createIndex({a:1})
    

    Um simples findOne()sem critérios de projeção retorna um resultado de consulta com cerca de 10 MB:

    > bsonsize(db.data.findOne({}))
    10485805
    

    Adicionar a projeção {a:1}limitará a saída ao campo ae ao documento _id(incluído por padrão). O servidor MongoDB ainda está manipulando um documento de 10 MB para selecionar dois campos, mas o resultado da consulta agora é de apenas 33 bytes:

    > bsonsize(db.data.findOne({}, {a:1}))
    33
    

    Essa consulta não é coberta porque o documento completo precisa ser buscado para descobrir o _idvalor. O _idcampo é incluído nos resultados da consulta por padrão, pois é o identificador exclusivo de um documento, mas _idnão será incluído em um índice secundário, a menos que seja explicitamente adicionado.

    As métricas totalDocsExaminede nos resultados mostrarão quantos documentos e chaves de índice foram examinados:totalKeysExaminedexplain()

     > db.data.find(
         {a:'webscale'}, 
         {a:1}
     ).explain('executionStats').executionStats.totalDocsExamined
     > 1
    

    Essa consulta pode ser aprimorada usando a projeção para excluir o _idcampo e obter uma consulta coberta usando apenas o {a:1}índice. A consulta coberta não precisa mais buscar um documento de ~10 MB na memória, portanto, será eficiente no uso da rede e da memória:

     > db.data.find(
         {a:'webscale'},
         {a:1, _id:0}
     ).explain('executionStats').executionStats.totalDocsExamined
     0
    
     > bsonsize(db.data.findOne( {a:'webscale'},{a:1, _id:0}))
     21
    

    Eu tenho consultas lentas do MongoDB. O retorno de um subconjunto afeta minha consulta lenta (tenho índice composto no campo)?

    Isso não pode ser respondido sem o contexto de uma consulta específica, documento de exemplo e a saída de explicação completa. No entanto, você pode executar alguns benchmarks em seu próprio ambiente para a mesma consulta com e sem projeção para comparar o resultado. Se sua projeção estiver adicionando uma sobrecarga significativa ao tempo geral de execução da consulta (processamento e transferência de resultados), isso pode ser um forte indício de que seu modelo de dados pode ser aprimorado.

    Se não estiver claro por que uma consulta é lenta, seria melhor postar uma nova pergunta com detalhes específicos para investigar.

    • 26
  2. JJussi
    2018-02-22T06:25:27+08:002018-02-22T06:25:27+08:00

    Com uma projeção, você pode obter uma situação em que o conjunto de resultados vem diretamente do índice.

    Se você tem índice composto {x:1, y:1, z:1}onde nenhum de x,y,z é _id, você precisa projetar {_id:0, x:1, y:1, z:1}porque _idsempre é retornado como parte do conjunto de resultados (quando não é projetado) e o mecanismo precisa ler arquivos de dados para obtê-lo. Isso porque o índice não tem valor de _id, apenas ponteiro para aquele documento onde o valor está armazenado.

    • 2

relate perguntas

  • Mongo Map-Reduce ou Sharding?

  • Configurando o Mongo com clustering

  • Diferença entre as chamadas find e findone do MongoDB

  • A fragmentação é eficaz para coleções pequenas?

  • Bons recursos para operar/administrar o MongoDB

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve