MongoDB concatena la clave compuesta de alguna manera y la usa como clave en un BTree.
Al buscar elementos individuales : el orden de los nodos en el árbol es irrelevante.
Si está devolviendo un rango de nodos , los elementos cercanos entre sí estarán en las mismas ramas del árbol. Cuanto más cerca estén los nodos del rango, más rápido se podrán recuperar.
Con un solo índice de campo : el orden no importará. Si están juntas en orden ascendente, también estarán juntas en orden descendente.
Cuando tienes una clave compuesta , el orden comienza a importar.
Por ejemplo, si la clave es A ascendente B ascendente, el índice podría verse así:
Fila AB
1 1 1
2 2 6
3 2 7
4 3 4
5 3 5
6 3 6
7 5 1
Una consulta para A ascendente B descendente necesitará saltar alrededor del índice fuera de orden para devolver las filas y será más lenta. Por ejemplo, devolverá Row1, 3, 2, 6, 5, 4, 7
Una consulta de rango en el mismo orden que el índice simplemente devolverá las filas secuencialmente en el orden correcto.
Encontrar un registro en un BTree toma O (Log (n)) tiempo. Encontrar un rango de registros en orden es solo OLog (n) + k donde k es el número de registros a devolver.
Si los registros están fuera de orden, el costo podría ser tan alto como OLog (n) * k
1, 3, 2, 6, 5, 4, 7
?La respuesta simple que está buscando es que la dirección solo importa cuando está ordenando en dos o más campos .
Si está ordenando por
{a : 1, b : -1}
:El índice
{a : 1, b : 1}
será más lento que el índice{a : 1, b : -1}
fuente
{a: -1, b: -1}
, debería tener{a: -1, b: -1}
índice o será{a: 1, b: 1}
suficiente?{a: 1, b: 1}
índice debería ser suficiente, ya que invertir un índice por completo está bien. Por ejemplo, Index on{a: 1}
se puede usar para ordenar en{a: -1}
Por que los índices
Comprende dos puntos clave.
Los índices no son gratuitos. Toman memoria e imponen una penalización de rendimiento al realizar inserciones, actualizaciones y eliminaciones. Normalmente, el impacto en el rendimiento es insignificante (especialmente en comparación con las ganancias en el rendimiento de lectura), pero eso no significa que no podamos ser inteligentes al crear nuestros índices.
Cómo los índices
Identificar qué grupo de campos deben indexarse juntos se trata de comprender las consultas que está ejecutando. El orden de los campos utilizados para crear su índice es fundamental. La buena noticia es que, si obtiene un orden incorrecto, el índice no se usará en absoluto, por lo que será fácil de detectar con una explicación.
Por qué ordenar
Es posible que sus consultas deban ordenar. Pero ordenar puede ser una operación costosa, por lo que es importante tratar los campos en los que está ordenando como si fueran un campo que está consultando. Entonces será más rápido si tiene index. Sin embargo, hay una diferencia importante, el campo que está ordenando debe ser el último campo en su índice. La única excepción a esta regla es que si el campo también forma parte de su consulta, la regla debe ser la última no se aplica.
Cómo ordenar
Puede especificar un orden en todas las claves del índice o en un subconjunto; sin embargo, las claves de clasificación deben aparecer en el mismo orden en que aparecen en el índice. Por ejemplo, un patrón de clave de índice {a: 1, b: 1} puede admitir una ordenación en {a: 1, b: 1} pero no en {b: 1, a: 1}.
La clasificación debe especificar la misma dirección de clasificación (es decir, ascendente / descendente) para todas sus claves como patrón de clave de índice o especificar la dirección de clasificación inversa para todas sus claves como patrón de clave de índice. Por ejemplo, un patrón de clave de índice {a: 1, b: 1} puede admitir una ordenación en {a: 1, b: 1} y {a: -1, b: -1} pero no en {a: -1 , b: 1}.
Supongamos que existen estos índices:
fuente
{ a: 1, b: 1, c: 1 }
lo que realmente necesita índices{ a: 1}
y{ a: 1, b: 1}
o índice{ a: 1, b: 1, c: 1 }
abarca todos los casos? Si las consultas siempre usan el mismo orden: 1 no ordena en la consulta con -1