los - ¿Por qué importa la dirección del índice en MongoDB?



mongodb crear indices (2)

Por qué los índices

Comprende dos puntos clave.

  1. Si bien un índice es mejor que ningún índice, el índice correcto es mucho mejor que cualquiera de los dos.
  2. MongoDB solo usará un índice por consulta, haciendo índices compuestos con el orden de campo apropiado que probablemente quiera usar.

Los índices no son gratuitos. Toman memoria e imponen una penalización de rendimiento al hacer inserciones, actualizaciones y eliminaciones. Normalmente, el rendimiento alcanzado 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 índices

Identificar qué grupo de campos se debe indexar es sobre comprender las consultas que está ejecutando. El orden de los campos utilizados para crear su índice es crítico. La buena noticia es que, si obtiene el pedido incorrecto, el índice no se utilizará en absoluto, por lo que será fácil de detectar con la explicación.

Por qué ordenar

Sus consultas pueden necesitar clasificación. Pero la clasificación puede ser una operación costosa, por lo que es importante tratar los campos que está ordenando como un campo que está consultando. Entonces será más rápido si tiene índice. Sin embargo, hay una diferencia importante, el campo que está ordenando debe ser el último campo de su índice. La única excepción a esta regla es si el campo también es parte de su consulta, entonces la regla que debe ser la última no se aplica.

Cómo clasificar

Puede especificar una ordenación en todas las claves del índice o en un subconjunto; sin embargo, las claves de clasificación deben estar enumeradas 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}.

El género debe especificar la misma dirección de clasificación (es decir, ascendente / descendente) para todas sus claves como el patrón de clave de índice o especificar la dirección de clasificación inversa para todas sus claves como el 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 hay estos í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 }

https://src-bin.com

Para citar los docs :

Al crear un índice, el número asociado con una tecla especifica la dirección del índice, por lo que siempre debe ser 1 (ascendente) o -1 (descendente). La dirección no importa para los índices de una sola clave o para la recuperación de acceso aleatorio, pero es importante si está haciendo ordenamientos o consultas de rango en índices compuestos.

Sin embargo, no veo ninguna razón por la cual la dirección del índice debería importar en los índices compuestos. ¿Puede alguien proporcionar una explicación adicional (o un ejemplo)?


Answer #1

La respuesta simple que está buscando es que la dirección solo importa cuando clasifica en dos campos .

Si está ordenando {a : 1, b : -1} :

El índice {a : 1, b : 1} será más lento que el índice {a : 1, b : -1}





query-optimization