Existem dois recursos relevantes de um índice que permitem pesquisas rápidas (em comparação com a execução de uma verificação de coleção):
- Ordem de valores
- Compactidade dos valores indexados
Se você tiver valores
a
e b
, você pode dizer que a
vem antes de b
, lexicograficamente. Se você tiver documentos {a: 2, b: 5}
e {b: 4, a: 3}
, não há uma ordenação única desses documentos que satisfaça as consultas típicas. Por exemplo, se você quiser que todos os a
valores ordenados, você pode esperar 2, 3
, mas se você quiser o b
valores que você pode esperar 4, 5
- exigindo que a ordem do documento seja estornada. Quando um banco de dados armazena o índice em disco, os valores são armazenados em ordem de índice (o que quer que seja para o índice específico, por exemplo, a ordenação afeta isso). Geralmente, não há uma única ordenação que possa ser usada para documentos de coleção em geral, portanto, os documentos de coleção não são ordenados.
Ao consultar por índice, você pega o valor que está sendo pesquisado e executa essencialmente uma pesquisa binária usando o índice porque os dados no índice são classificados.
A segunda razão para usar o índice é que, se você estiver verificando a coleção, para cada documento, o documento inteiro normalmente precisa ser recuperado do disco e ignorado. Se você tiver uma coleção de 100 GB e estiver fazendo uma varredura, talvez seja necessário pular mais de 100 GB de dados. Se a mesma coleção tiver um índice de 100 MB em algum campo (porque o índice armazena apenas os valores nesse campo e não os dados de todo o documento), e o banco de dados executa uma varredura completa do índice, ele só precisa percorrer 100 MB de dados.
Agora, para sua pergunta sobre armazenar falta de valores em um índice.
Do ponto de vista do índice, a "falta de valor" em diferentes documentos é o mesmo valor. Você perde a capacidade de fazer pesquisa binária quando todos os seus valores são idênticos. Portanto, se você estiver procurando por esse documento de "falta de valor", o índice retornará todos os documentos da coleção que não tiverem valor, e você terá que fazer uma varredura neles de qualquer maneira para filtrar por quaisquer outras condições que você tenho. Como isso geralmente produz má seletividade, os bancos de dados não se preocupam com índices e fazem varreduras de coleção em primeiro lugar.
E, provavelmente, você deseja alguns outros campos da sua consulta, não o campo que não tem um valor. Então agora você quer que o índice armazene documentos completos, derrotando a ideia de compacidade.