Na coleção A, cada documento contém até 100 campos. O banco de dados, mongoDB, permite apenas até 64 índices em uma única coleção.
Os índices são necessários para uma consulta nesta coleção. A etapa filtro, ou $match
, desta consulta pode ser feita utilizando qualquer combinação dos 100 campos.
Mesmo que sejam criados 64 índices, ele poderá cobrir no máximo 64 campos.
Problema:
Isso significa que, se a consulta for filtrada com base em qualquer um dos 36 campos não indexados, uma varredura de coleta deverá ser feita para concluir a consulta.
Pergunta:
Existem formas alternativas de otimizar essa consulta, impedindo uma varredura de coleção em todas as combinações possíveis dessa consulta?
Como você compra mantimentos quando a refeição que está sendo preparada é imprevisível? - Você não. Ou você gasta uma tonelada de dinheiro comprando todos os itens de mercearia de forma proativa.
Para uma tabela fina (apenas algumas colunas), pode ser possível indexar todas as combinações realistas de campos a serem pesquisados. Mas na maioria das vezes para a maioria das tabelas não é razoavelmente possível. E quase sempre não é necessário.
Este é um pedido incomum. Mesmo empresas de grande porte como o Facebook (para relacionar um exemplo com suas outras postagens) não pesquisam em tantos campos ao mesmo tempo. Quando você insere um termo de pesquisa na caixa de pesquisa, ele pesquisa apenas alguns campos fixos, como
FirstName
,LastName
, , etc.Description
Tag
Birthday
Age
Gender
Não exatamente. Um único índice pode abranger várias combinações de campos ao mesmo tempo. Por exemplo, um único índice nos campos
(FirstName, LastName, Tag)
cobriria predicados em apenasFirstName
ou emFirstName
eLastName
ouFirstName
,LastName
eTag
. Portanto, dependendo dos usos realistas, um índice pode abranger vários casos de uso.Sei que parece que você está recebendo muitas respostas redundantes que não parecem ajudá-lo em cada uma de suas perguntas recentes, mas isso ocorre porque a otimização para uma situação específica é muito específica. Infelizmente, apenas essas informações generalizadas podem ser fornecidas com os detalhes genéricos que você forneceu até agora.
Se você quiser fornecer os casos de uso exatos que possui, incluindo qual é o sistema em que está trabalhando, quais são os objetos envolvidos, como eles são estruturados, alguns dados de exemplo e como você está tentando pesquisá-los, então talvez um conjunto mais específico de abordagens de otimização possa ser fornecido, o que provavelmente será orientado para a implementação do projeto.
Estou me repetindo: revise o design do seu banco de dados, é muito ruim - apenas acredite!
De qualquer forma, você diz "Índices são necessários para uma consulta nesta coleção." Sim, isso é verdade, mas isso não significa que você precisa de um índice em cada campo que aparece (ou pode aparecer) no
$match
palco.Crie índices nos campos que são mais comumente usados ou mais esperados. Se um único valor de índice retornar 100 documentos (de 10 milhões), isso ainda será muito rápido. O MongoDB pode escaneá-los em alguns milissegundos.
Um campo com baixa cardinalidade não precisa de nenhum índice. O desempenho da consulta não mudará se você colocar um índice em tal campo ou não. Uma cardinalidade baixa típica seria, por exemplo, um
gender
campo, tem apenasmale
efemale
(e talvezothers
). Um índice nesse campo é um desperdício de espaço em disco, mesmo que faça parte de todas as consultas. Uma combinação arbitrária de 100 campos dá uma quantidade enorme de condições possíveis, você nunca será capaz de cobrir todas elas. Concentre-se apenas no Top-5!