Desempenho do MongoDB em relação ao RDBMS
Avalie esse Artigo
Em algum lugar, alguém pode estar se perguntado por que obtemos desempenho superior com o MongoDB em relação aos bancos de dados RDBMS. Qual é o segredo por trás disso? Eu também tinha essa pergunta até aprender sobre o funcionamento interno do MongoDB, especialmente modelagem de dados, métodos avançados de índice e, finalmente, como funciona o storage engine WiredTiger.
Eu queria compartilhar meus aprendizados e experiências para revelar o segredo disso, para que ele também possa ser útil para você.
O MongoDB usa um modelo de dados orientado a documentos, armazenando dados em documentos BSON do tipo JSON. Isso permite o armazenamento e a recuperação eficientes de estruturas de dados complexas.
O modelo do MongoDB pode levar a queries mais simples e de melhor desempenho em comparação com os requisitos de normalização do RDBMS.
A fase inicial de aprimoramento do desempenho envolve a compreensão dos comportamentos de consulta do seu aplicativo. Esse entendimento permite que você adapte seu modelo de dados e escolha índices adequados para se alinhar a esses padrões de forma eficaz.
Lembre-se sempre do tamanho otimizado do documento do MongoDB (que é 16 MB) para evitar a incorporação de arquivos de imagens, áudio e vídeo na mesma coleção, conforme ilustrado na imagem abaixo.
Personalizar seu modelo de dados para corresponder aos padrões de consulta de seu aplicativo leva a consultas simplificadas, maior taxa de transferência para operações de inserção e atualização e melhor distribuição de carga de trabalho em um cluster fragmentado.
Embora o MongoDB ofereça um esquema flexível, não é aconselhável ignorar o design do esquema. Embora você possa ajustar seu esquema conforme necessário, aderir às práticas recomendadas de design de esquema desde o início do seu projeto pode evitar a necessidade de refatoração extensiva no futuro.
Uma grande vantagem dos documentos BSON é que você tem a flexibilidade de modelar seus dados da forma que seu aplicativo precisar. A inclusão de arrays e subdocumentos dentro de documentos fornece versatilidade significativa na modelagem de relacionamentos de dados intrincados. Mas você também pode modelar estruturas planas, tabulares e colunares, pares simples de valores-chave, texto, dados geoespaciais e de séries temporais ou os nós e bordas de estruturas de dados de grafos conectados. O projeto de esquema ideal para seu aplicativo dependerá de seus padrões de query específicos.
Um exemplo de prática recomendada para um catálogo de endereços/contatos envolve a separação de grupos e informações de retratos em uma coleção diferente, pois eles podem Go devido às relações n-n e ao tamanho da imagem, respectivamente. Eles podem atingir um tamanho de documento otimizado de 16 MB.
A incorporação de dados em uma única coleção no MongoDB (ou minimização do número de coleções, pelo menos) versus armazenamento em várias tabelas no RDBMS oferece enormes melhorias de desempenho devido à localidade dos dados que reduzirá as buscas de dados, conforme mostrado na imagem abaixo.
A localidade dos dados é a principal razão pela qual as buscas de dados do MongoDB são mais rápidas.
Diferença: tabular versus documento
Tabular | MongoDB | |
---|---|---|
Etapas para criar o modelo | 1 - define o esquema. 2 - desenvolver aplicativo e queries | 1 - identificando as queries 2- definir esquema |
Esquema inicial | 3rd forma normal. Uma possível solução | Muitas soluções possíveis |
Esquema final | Provávelmente desnormalizado | Poucas mudanças |
Evolução do esquema | Difícil e não ideal. Provável tempo de inatividade | Fácil. Sem tempo de inatividade |
Desempenho | Mediocre | Otimizado |
O WiredTiger é um mecanismo de armazenamento de alto desempenho e código aberto para o MongoDB. O WiredTiger oferece recursos como controle de simultaneidade em nível de documento, compactação e suporte para armazenamento na memória e no disco.
Cache:
Arquitetura de cache WiredTiger: O WiredTiger utiliza um mecanismo de cache sofisticado para gerenciar com eficiência os dados na memória. O cache é usado para armazenar dados acessados com frequência, reduzindo a necessidade de leitura do disco e melhorando o desempenho geral.
Gerenciamento de memória: O cache gerencia dinamicamente o uso de memória com base na carga de trabalho. Ele emprega técnicas como remoção (remoção de dados usados com menos frequência do cache) e promoção (mover dados usados com frequência para o cache) para otimizar a utilização da memória.
Configuração: o WiredTiger permite que os usuários configurem o tamanho do cache com base nas características de memória disponível e volume de trabalho do sistema. O dimensionamento adequado do cache é crucial para obter o desempenho ideal.
Durabilidade: o WiredTiger garante a durabilidade liberando dados modificados do cache para o disco. Esse processo ajuda a manter a consistência dos dados em caso de falha do sistema.
Compressão:
Compactação de dados: o WiredTiger suporta compactação de dados para reduzir a quantidade de espaço de armazenamento necessário. A compactação de dados pode levar a uma economia significativa de espaço em disco e a um melhor desempenho de E/S.
Compressão configurável: os usuários podem configurar opções de compressão com base em seus requisitos. O WiredTiger oferece suporte a diferentes algoritmos de compressão, permitindo que os usuários escolham o que melhor se adequa ao seu volume de trabalho e metas de desempenho.
Compensações: Embora a compactação reduza os custos de armazenamento e possa melhorar o desempenho de leitura/gravação, ela pode introduzir uma sobrecarga adicional da CPU durante os processos de compactação e descompactação. Os usuários precisam considerar cuidadosamente as desvantagens e selecionar configurações de compactação que se alinham às necessidades de seu aplicativo.
Compatibilidade: os recursos de compressão do WiredTiger são transparentes para os aplicativos e não exigem nenhuma alteração no código do aplicativo. O motor lida com compressão e descompressão internamente.
No geral, os recursos de cache e compressão do WiredTiger contribuem para suas características de eficiência e desempenho. Ao otimizar o uso da memória e fornecer opções de compactação configuráveis, o WiredTiger tem como objetivo atender às diversas necessidades dos usuários do MongoDB em termos de velocidade e eficiência de armazenamento.
Alguns sistemas RDBMS também empregam cache, mas os benefícios de desempenho podem variar de acordo com o sistema e a configuração do banco de dados.
O MongoDB, sendo um banco de dados NoSQL, oferece recursos avançados de indexação para otimizar o desempenho da query e oferecer suporte à recuperação eficiente de dados. Aqui estão alguns dos recursos avançados de indexação do MongoDB:
Índices compostos
O MongoDB permite que você crie índices compostos em vários campos. Um índice composto é um índice em vários campos em uma ordem específica. Isto pode ser útil para queries que envolvem múltiplos critérios.
A ordem dos campos em um índice composto é crucial. O MongoDB pode usar o índice de forma eficiente para queries que correspondam aos campos de índice da esquerda para a direita.
Multikey indexes
O MongoDB suporta indexação em matrizes. Ao indexar um campo de array, o MongoDB cria entradas de índice separadas para cada elemento do array.
Os índices de várias chaves são úteis ao trabalhar com documentos que contêm arrays, e você precisa fazer query com base em elementos dentro desses arrays.
Text indexes
O MongoDB fornece índices de texto para dar suporte à pesquisa de texto completo. Os índices de texto tokenizam e originam palavras, permitindo pesquisas de texto mais flexíveis e com reconhecimento de idioma.
Os índices de texto são adequados para cenários em que os usuários precisam realizar operações de pesquisa de texto em grandes quantidades de dados textuais.
Índices geoespaciais
O MongoDB suporta índices geoespaciais para otimizar queries que envolvem dados geoespaciais. Esses índices podem lidar com eficiência com consultas relacionadas a informações baseadas em localização.
Os índices geoespaciais suportam indexação 2D e 3D, permitindo a representação de geometrias planas e esféricas.
Índices curinga
O MongoDB oferece suporte a índices curinga, permitindo que você crie índices que abrangem somente um subconjunto de campos em um documento. Isso pode ser útil quando você tem padrões de consulta específicos e deseja otimizar esses padrões sem indexar todos os campos.
Índices Parciais
Os índices parciais permitem que você indexe apenas os documentos que atendem a uma expressão de filtro especificada. Isso pode ser benéfico quando você tiver uma collection grande, mas quiser criar um índice para um subconjunto de documentos que atendam a critérios específicos.
Índices com hash
Os índices hash são úteis para cenários de fragmentação. O MongoDB faz hash automaticamente dos valores do campo indexado e distribui os dados entre os fragmentos, fornecendo uma distribuição mais uniforme de dados e queries.
Índices de tempo de vida (TTL)
Os índices TTL permitem que você expire automaticamente documentos de uma coleção após um determinado período de tempo. Isso é útil para gerenciar dados que têm uma expiração natural, como informações de sessão ou entradas de log.
Esses recursos avançados de indexação no MongoDB fornecem aos desenvolvedores ferramentas poderosas para otimizar o desempenho da query para uma ampla variedade de cenários e estruturas de dados. O uso adequado desses recursos pode aumentar significativamente a eficiência e a capacidade de resposta dos bancos de dados MongoDB.
Concluindo, o desempenho superior do MongoDB em relação aos bancos de dados RDBMS tradicionais deriva de seu manuseio habilidoso de modelagem de dados, métodos avançados de indexação e eficiência do storage engine WiredTiger. Ao adaptar o seu modelo de dados para corresponder aos padrões de consulta dos aplicativos, aproveitar a estrutura otimizada de documentos do MongoDB e aproveitar os recursos avançados de indexação, você pode obter um rendimento aprimorado e uma distribuição mais eficaz da carga de trabalho.
Lembre-se de que, embora o MongoDB ofereça flexibilidade no design de esquemas, é crucial não ignorar a importância das práticas recomendadas de design de esquemas desde o início do seu projeto. Essa abordagem proativa pode salvá-lo de possíveis esforços de refatoração no futuro.
Para obter mais informações e discussões sobre o MongoDB e estratégias de otimização de banco de dados, considere participar da nossa Comunidade de desenvolvedores. Ali, você pode interagir com outros desenvolvedores, compartilhar insights e manter-se atualizado sobre os mais recentes desenvolvimentos em tecnologia de banco de dados.
Continue otimizando e innovando com o MongoDB para liberar todo o potencial de seus aplicativos.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.