Por que índices
Compreenda dois pontos principais.
- Embora um índice seja melhor do que nenhum índice, o índice correto é muito melhor do que qualquer um deles.
- O MongoDB usará apenas um índice por consulta, criando índices compostos com a ordenação de campo adequada o que você provavelmente deseja usar.
Os índices não são gratuitos. Eles ocupam memória e impõem uma penalidade de desempenho ao fazer inserções, atualizações e exclusões. Normalmente, o impacto no desempenho é insignificante (especialmente em comparação com os ganhos no desempenho de leitura), mas isso não significa que não podemos ser inteligentes ao criar nossos índices.
Como índices
Identificar qual grupo de campos deve ser indexado em conjunto é compreender as consultas que você está executando. A ordem dos campos usados para criar seu índice é crítica. A boa notícia é que, se você errar na ordem, o índice não será usado, então será fácil localizá-lo com uma explicação.
Por que classificar
Suas consultas podem precisar de classificação. Mas a classificação pode ser uma operação cara, por isso é importante tratar os campos que você está classificando como um campo que você está consultando. Então será mais rápido se tiver índice. Porém, há uma diferença importante: o campo que você está classificando deve ser o último campo em seu índice. A única exceção a esta regra é se o campo também fizer parte da sua consulta, então a regra deve ser o último não se aplica.
Como classificar
Você pode especificar uma classificação em todas as chaves do índice ou em um subconjunto; no entanto, as chaves de classificação devem ser listadas na mesma ordem em que aparecem no índice. Por exemplo, um padrão de chave de índice {a: 1, b: 1} pode suportar uma classificação em {a: 1, b: 1}, mas não em {b: 1, a: 1}.
A classificação deve especificar a mesma direção de classificação (ou seja, crescente / decrescente) para todas as suas chaves como o padrão de chave de índice ou especificar a direção de classificação reversa para todas as suas chaves como o padrão de chave de índice. Por exemplo, um padrão de chave de índice {a: 1, b: 1} pode suportar uma classificação em {a: 1, b: 1} e {a: -1, b: -1}, mas não em {a: -1 , b: 1}.
Suponha que existam estes índices:
{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }
Example Index Used
db.data.find().sort( { a: 1 } ) { a: 1 }
db.data.find().sort( { a: -1 } ) { a: 1 }
db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }
1, 3, 2, 6, 5, 4, 7
?