O MongoDB concatena a chave composta de alguma forma e a usa como a chave em um BTree.
Ao encontrar itens únicos - A ordem dos nós na árvore é irrelevante.
Se você estiver retornando um intervalo de nós - Os elementos próximos um do outro estarão nos mesmos galhos da árvore. Quanto mais próximos os nós estão no intervalo, mais rapidamente eles podem ser recuperados.
Com um único índice de campo - A ordem não importa. Se eles estiverem próximos em ordem crescente, também estarão próximos em ordem decrescente.
Quando você tem uma chave composta - A ordem começa a importar.
Por exemplo, se a chave for A ascendente B ascendente, o índice pode ter a seguinte aparência:
Fileira AB
1 1 1
2 2 6
3 2 7
4 3 4
5 3 5
6 3 6
7 5 1
Uma consulta para A ascendente B descendente precisará pular o índice fora de ordem para retornar as linhas e será mais lenta. Por exemplo, ele retornará Row1, 3, 2, 6, 5, 4, 7
Uma consulta variada na mesma ordem do índice simplesmente retornará as linhas sequencialmente na ordem correta.
Encontrar um registro em um BTree leva tempo O (Log (n)). Encontrar um intervalo de registros em ordem é apenas OLog (n) + k, onde k é o número de registros a serem retornados.
Se os registros estiverem fora de ordem, o custo pode ser tão alto quanto OLog (n) * k
1, 3, 2, 6, 5, 4, 7
?A resposta simples que você está procurando é que a direção só importa quando você está classificando em dois ou mais campos .
Se você está classificando em
{a : 1, b : -1}
:O índice
{a : 1, b : 1}
será mais lento que o índice{a : 1, b : -1}
fonte
{a: -1, b: -1}
, devo ter{a: -1, b: -1}
índice ou será{a: 1, b: 1}
o suficiente.{a: 1, b: 1}
índice deve ser suficiente, já que inverter um índice completamente é bom. por exemplo, o índice{a: 1}
pode ser usado para uma classificação{a: -1}
Por que índices
Compreenda dois pontos principais.
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:
fonte
{ a: 1, b: 1, c: 1 }
, você realmente precisa de índices{ a: 1}
e /{ a: 1, b: 1}
ou índice{ a: 1, b: 1, c: 1 }
cobre todos os casos? Se as consultas sempre usarem a mesma classificação: 1 nenhuma classificação na consulta com -1