¿Por qué es importante la dirección del índice en MongoDB?

Para citar el documentos:

Al crear un índice, el número asociado con una clave 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 clave única o para la recuperación de acceso aleatorio, pero es importante si realiza consultas de ordenación o rango en índices compuestos.

Sin embargo, no veo ninguna razón por la que la dirección del índice deba importar en los índices compuestos. ¿Puede alguien proporcionar una explicación más detallada (o un ejemplo)?

preguntado el 26 de abril de 12 a las 08:04

3 Respuestas

MongoDB concatena la clave compuesta de alguna manera y la usa como clave en un BTree.

Al encontrar elementos individuales - El orden de los nodos en el árbol es irrelevante.

Si está devolviendo un rango de nodos - Los elementos próximos entre sí estarán bajando por 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 juntos en orden ascendente, también lo estarán en orden descendente.

Cuando tienes una clave compuesta - El orden empieza 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 deberá saltar alrededor del índice fuera de orden para devolver las filas y será más lenta. Por ejemplo, devolverá Fila 1, 3, 2, 6, 5, 4, 7

Una consulta a distancia 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 desordenados, el costo podría ser tan alto como OLog(n) * k

Respondido 21 Abr '13, 19:04

La fila resultante probablemente debería ser 1, 3, 2, 6, 5, 4, 7? - juandodo

Todavía no veo ninguna razón para que sea más lento. Solo el algoritmo debe ser diferente (para cada grupo de valores en A, debe saltar al final del grupo y procesarlo en orden inverso), pero dado que los índices de MongoDB están en la memoria, eso no debería tener un efecto notable en la velocidad. Además, RDBMS no sabe nada sobre la dirección con índices y la situación allí es bastante similar. - juandodo

La razón por la que es un éxito de rendimiento es porque no es solo una lista secuencial en la memoria como el ejemplo simplificado. En realidad es un árbol ponderado. Saltar fuera de orden implicará atravesar el árbol nuevamente. RDMS definitivamente tiene orden de índices. - Jared Kells

Obtener nodos de un BTree en orden es tan simple como moverse a lo largo de cada hoja hasta que se agote y luego subir un nivel y bajar a la siguiente rama. Es O(n) fuera de servicio, es mucho más intensivo en CPU. - Jared Kells

¿Sigue siendo un problema para indexar/ordenar en un campo booleano? Si quiero obtener solo los elementos "activos" de un usuario, ¿debería crear un índice? { user_id: 1, active: 1 } or { user_id: 1, active: -1 } o importa? (asumiendo active puede ser verdadero/falso y no hay valores nulos en la base de datos) - Cyril Duchon-Doris

El Respuesta simple lo que buscas es que la direccion solo importa cuando está ordenando en dos o más campos.

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

Home {a : 1, b : 1} se mostrarán más lento que índice {a : 1, b : -1}

respondido 15 mar '19, 15:03

@MarkPieszak porque todo el tipo tendría que hacerse en la memoria haciendo que el índice sea inútil: sammaye

@Sammaye Creo que esa es la idea correcta, aunque no estoy seguro de que sea la toda clasificar. Tendría que mirar la implementación para saber cómo funciona realmente, pero creo que los resultados podrían retirarse ordenados por a solo, y luego el adicional b ordenar tendría que hacerse en la memoria. - Zaid Masud

hmm, extraño, la última vez que revisé el código dejó caer clasificaciones parciales debido a cómo fue la clasificación, pero meh, tal vez haya cambiado: sammaye

¿Qué pasa si estoy ordenando {a: -1, b: -1}, debería tener {a: -1, b: -1} índice o testamento {a: 1, b: 1} será suficiente. - Hussain

@Hussain en tu ejemplo el {a: 1, b: 1} index debería ser suficiente, ya que invertir un índice por completo está bien. por ejemplo, índice en {a: 1} se puede usar para ordenar {a: -1} - Zaid Masud

¿Por qué índices?

Entiende 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, creando índices compuestos con el orden de campo adecuado que probablemente desee usar.

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 í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 se equivoca en el orden, el índice no se utilizará en absoluto, por lo que será fácil de detectar con 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á clasificando como 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 si el campo también forma parte de su consulta, entonces la regla de debe ser el último no se aplica.

Cómo clasificar

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

{ 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 }

Respondido el 20 de junio de 20 a las 10:06

Entiendo que es un ejemplo, pero si hay un índice { a: 1, b: 1, c: 1 } ¿realmente necesitas índices? { a: 1} y { a: 1, b: 1} o índice { a: 1, b: 1, c: 1 } cubre todos los casos? Si las consultas siempre usan el mismo tipo: 1 no se clasifica en la consulta con -1 - Lukas Liesis

Si hay muchas consultas que funcionan solo en la propiedad 'a', es más rápido buscar con el índice con la propiedad 'a' para el motor de la base de datos, que buscar con el índice con 3 propiedades 'a', 'b', 'c'. Porque el tamaño del índice aumentará y el recuento también aumentará. ex. Si hay 20 capítulos en el libro. Entonces es más rápido ir al capítulo 3 y luego a la página específica. @LukasLiesis- Somnath Muluk

debo crear { date: -1, _id: 1 } & { date: 1, _id: -1 } los dos o solo uno? - Rajan

Descubrí que uno de ellos será suficiente. mira aquí docs.mongodb.com/manual/core/index-compound/#sort-order - Rajan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.