Compartilhar via


Otimizar o desempenho de gravação no Azure Cosmos DB for MongoDB

APLICA-SE AO: MongoDB

A otimização do desempenho de gravação ajuda você a aproveitar ao máximo a escala ilimitada do Azure Cosmos DB for MongoDB. Ao contrário de outros serviços gerenciados do MongoDB, a API para MongoDB fragmenta de forma automática e transparente suas coleções para você (ao usar coleções fragmentadas) para dimensionar infinitamente.

A maneira como você escreve os dados precisa ser cuidadosa, por meio da paralelização e propagação de dados entre fragmentos, para obter a maioria das gravações de seus bancos de dados e coleções. Este artigo explica as melhores práticas para otimizar o desempenho de gravação.

Espalhar a carga entre seus fragmentos

Ao gravar dados em uma API fragmentada para a coleta do MongoDB, seus dados são divididos (fragmentados) em pequenas fatias e são gravados em cada fragmento com base no valor do seu campo de chave de fragmentação. Você pode considerar cada fatia como uma pequena parte de uma máquina virtual que armazena apenas os documentos que contêm um valor de chave de fragmento exclusivo.

Se o aplicativo gravar uma grande quantidade de dados em um único fragmento, isso não será eficiente, pois ele estaria maximizando a taxa de transferência de apenas um fragmento em vez de distribuir a carga entre todos os seus fragmentos. Seu carregamento de gravação será distribuído uniformemente em sua coleção por meio da gravação em paralelo em muitos documentos com valores de chave de fragmento exclusivos.

Um exemplo disso seria um aplicativo de catálogo de produtos fragmentado no campo de categoria. Em vez de gravar em uma categoria (fragmento) por vez, é melhor gravar todas as categorias simultaneamente para atingir a taxa de transferência máxima de gravação.

Reduzir o número de índices

A indexação é um ótimo recurso para reduzir drasticamente o tempo necessário para consultar seus dados. Para a experiência de consulta mais flexível, a API para MongoDB habilita um índice curinga em seus dados por padrão para fazer consultas em relação a todos os campos mais rápidos. No entanto, todos os índices, que incluem índices curinga, introduzem carga adicional ao gravar dados porque as gravações alteram a coleção e os índices.

A redução do número de índices para apenas os índices necessários para dar suporte às suas consultas fará com que suas gravações sejam mais rápidas e baratas. Como regra geral, recomendamos o seguinte:

  • Qualquer campo que você filtre deve ter um índice de campo único correspondente. Essa opção também habilita a filtragem de vários campos.
  • Qualquer grupo de campos que você classificar deve ter um índice composto.

Definir a ordem como false nos drivers do MongoDB

Por padrão, os drivers do MongoDB definem a opção de ordem como "true" ao gravar dados, o que grava cada documento na ordem um por um. Essa opção reduz o desempenho de gravação, uma vez que cada solicitação de gravação precisa aguardar que a anterior seja concluída. Ao gravar dados, defina essa opção como false para melhorar o desempenho.

db.collection.insertMany(
   [ <doc1> , <doc2>, ... ],
   {
      ordered: false
   }
)

Ajustar para o tamanho de lote e a contagem de threads ideais

A paralelização de operações de gravação em vários threads/processos é fundamental para o dimensionamento de gravações. A API para MongoDB aceita gravações em lotes de até 1.000 documentos para cada processo/thread.

Se você estiver escrevendo mais de 1.000 documentos por vez por processo/thread, as funções de cliente como insertMany() devem ser limitadas a aproximadamente 1.000 documentos. Caso contrário, o cliente aguardará a confirmação de cada lote antes de passar para o próximo lote. Em alguns casos, dividir os lotes com menos ou um pouco mais de 1.000 documentos será mais rápido.

Próximas etapas