Redsandro,
Você deve considerar
Index Cardinality
e Selectivity
. 1. Cardinalidade do índice
A cardinalidade do índice refere-se a quantos valores possíveis existem para um campo. O campo
sex
só tem dois valores possíveis. Tem uma cardinalidade muito baixa . Outros campos, como names, usernames, phone numbers, emails
, etc. terão um valor mais exclusivo para cada documento da coleção, que é considerado alta cardinalidade . -
Maior Cardinalidade
Quanto maior a cardinalidade de um campo, mais útil será um índice, porque os índices estreitam o espaço de pesquisa, tornando-o um conjunto muito menor.
Se você tiver um índice sobresex
e você está procurando por homens chamados John. Você só diminuiria o espaço de resultados em aproximadamente %50 se indexasse porsex
primeiro. Por outro lado, se você indexou porname
, você restringiria imediatamente o conjunto de resultados a uma fração de um minuto de usuários chamados John e, em seguida, consultaria esses documentos para verificar o sexo.
-
Regra prática
Tente criar índices emhigh-cardinality
teclas ou coloquehigh-cardinality
chaves primeiro no índice composto. Você pode ler mais sobre isso na seção sobre índices compostos no livro:
MongoDB O Guia Definitivo
2. Seletividade
Além disso, você deseja usar índices seletivamente e escrever consultas que limitem o número de documentos possíveis com o campo indexado. Para simplificar, considere a seguinte coleção. Se seu índice for
{name:1}
, Se você executar a consulta { name: "John", sex: "male"}
. Você terá que escanear 1
documento. Porque você permitiu que o MongoDB fosse seletivo. {_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Considere a seguinte coleção. Se seu índice for
{sex:1}
, Se você executar a consulta {sex: "male", name: "John"}
. Você terá que escanear 4
documentos. {_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Imagine as possíveis diferenças em um conjunto de dados maior.
Uma pequena explicação sobre índices compostos
É fácil fazer a suposição errada sobre índices compostos. De acordo com os documentos do MongoDB sobre índices compostos.
O MongoDB suporta índices compostos, onde uma única estrutura de índice contém referências a vários campos dentro dos documentos de uma coleção. O diagrama a seguir ilustra um exemplo de um índice composto em dois campos:
Ao criar um índice composto, 1 índice conterá vários campos. Então, se indexarmos uma coleção por
{"sex" : 1, "name" : 1}
, o índice será mais ou menos assim:["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
Se indexarmos uma coleção por
{"name" : 1, "sex" : 1}
, o índice será mais ou menos assim:["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
Tendo
{name:1}
já que o prefixo irá atendê-lo muito melhor no uso de índices compostos. Há muito mais que pode ser lido sobre o tema, espero que isso possa oferecer alguma clareza.