Deixe-me dar algumas dicas com base no meu conhecimento e experiência global:
Use nomes de campo mais curtos
O MongoDB armazena a mesma chave para cada documento. Essa repetição causa um aumento no espaço em disco. Isso pode ter algum problema de desempenho em um banco de dados muito grande como o seu.
Prós:
- Menor tamanho dos documentos, portanto, menos espaço em disco
- Mais documentos para caber na RAM (mais armazenamento em cache)
- O tamanho dos índices do será menor em alguns cenários
Contras:
- Nomes menos legíveis
Otimize no tamanho do índice
Quanto menor o tamanho do índice, mais ele cabe na RAM e menos a falta de índice acontece. Considere um hash SHA1 para git commits, por exemplo. Um commit do git é muitas vezes representado pelos primeiros 5-6 caracteres. Em seguida, basta armazenar os 5-6 caracteres em vez de todo o hash.
Entenda o fator de preenchimento
Para atualizações que ocorrem no documento, causando uma movimentação dispendiosa do documento. Este documento se move, causando a exclusão do documento antigo e a atualização para um novo local vazio e a atualização dos índices, o que é caro.
Precisamos garantir que o documento não se mova se ocorrer alguma atualização. Para cada coleção há um fator de preenchimento envolvido que informa, durante a inserção do documento, quanto espaço extra deve ser alocado além do tamanho real do documento.
Você pode ver o fator de preenchimento da coleção usando:
db.collection.stats().paddingFactor
Adicione um preenchimento manualmente
No seu caso, você certamente começará com um pequeno documento que crescerá. Atualizar seu documento depois de algum tempo causará várias movimentações de documentos. Então é melhor adicionar um preenchimento para o documento. Infelizmente, não há uma maneira fácil de adicionar um preenchimento. Podemos fazer isso adicionando alguns bytes aleatórios a alguma chave ao inserir e, em seguida, excluir essa chave na próxima consulta de atualização.
Por fim, se você tiver certeza de que algumas chaves chegarão aos documentos no futuro, pré-aloque essas chaves com alguns valores padrão para que atualizações adicionais não causem aumento do tamanho do documento causando movimentações de documentos.
Você pode obter detalhes sobre a consulta que está causando a movimentação do documento:
db.system.profile.find({ moved: { $exists : true } })
Grande quantidade de coleções VS grande número de documentos em poucas coleções
Esquema é algo que depende dos requisitos do aplicativo. Se houver uma coleção enorme na qual consultamos apenas os últimos N dias de dados, podemos optar por ter uma coleção separada e os dados antigos podem ser arquivados com segurança. Isso garantirá que o cache na RAM seja feito corretamente.
Cada coleção criada incorre em um custo que é maior do que o custo de criação da coleção. Cada coleção tem um tamanho mínimo que é de alguns KBs + um índice (8 KB). Cada coleção tem um namespace associado, por padrão temos alguns namespaces de 24K. Por exemplo, ter uma coleção por usuário é uma má escolha, pois não é escalável. Depois de algum ponto, o Mongo não nos permitirá criar novas coleções de índices.
Geralmente, ter muitas coleções não tem penalidade de desempenho significativa. Por exemplo, podemos optar por ter uma coleção por mês, se soubermos que estamos sempre consultando com base em meses.
Desnormalização de dados
É sempre recomendável manter todos os dados relacionados a uma consulta ou sequência de consultas no mesmo local do disco. Você precisa duplicar as informações em diferentes documentos. Por exemplo, em uma postagem de blog, você deseja armazenar os comentários da postagem no documento de postagem.
Prós:
- o tamanho do índice será muito menor, pois o número de entradas do índice será menor
- a consulta será muito rápida, o que inclui buscar todos os detalhes necessários
- o tamanho do documento será comparável ao tamanho da página, o que significa que quando trazemos esses dados na RAM, na maioria das vezes não trazemos outros dados ao longo da página
- A movimentação do documento garantirá que estamos liberando uma página, não um pequeno pedaço da página que não pode ser usado em outras inserções
Coleções limitadas
A coleção limitada se comporta como buffers circulares. Eles são um tipo especial de coleções de tamanho fixo. Essas coleções podem receber gravações de altíssima velocidade e leituras sequenciais. Sendo de tamanho fixo, uma vez preenchido o espaço alocado, os novos documentos são escritos excluindo os mais antigos. No entanto, as atualizações de documentos só são permitidas se o documento atualizado se ajustar ao tamanho do documento original (brinque com o preenchimento para obter mais flexibilidade).