Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Strategies

La Regla ESR (Igualdad, Orden, Rango)

Un índice que hace referencia a múltiples campos es un índice compuesto. Los índices compuestos mejoran drásticamente los tiempos de respuesta a las consultas.

Las claves de índice corresponden a los campos del documento. En la mayoría de los casos, aplicar la Regla ESR (Igualdad, Ordenar, Rango) para organizar las claves del índice ayuda a crear un índice compuestomás eficiente.

Esta página presenta la Regla ESR. Para obtener más información sobre cómo optimizar consultas, consulta explain y Planes de consulta.

Tip

Para forzar a MongoDB a usar un índice particular, utilice cursor.hint() al probar índices.

"Exacta" se refiere a una coincidencia exacta de un único valor. Las siguientes consultas de coincidencia exacta escanean la colección cars en busca de documentos cuyo campo model coincide exactamente con Cordoba.

db.cars.find( { model: "Cordoba" } )
db.cars.find( { model: { $eq: "Cordoba" } } )

Las búsquedas en índices utilizan eficientemente las coincidencias exactas para limitar el número de documentos necesarios para completar una consulta. Coloque primero en el índice los campos que requieren coincidencias exactas.

Un índice puede tener múltiples claves para query con coincidencias exactas. Las claves de índice para las coincidencias exactas pueden aparecer en cualquier orden. Sin embargo, para cumplir con una coincidencia exacta con el índice, todas las claves del índice para coincidencias exactas deben preceder a cualquier otro campo del índice. El algoritmo de búsqueda de MongoDB elimina la necesidad de colocar los campos de coincidencia exacta en un orden específico.

Las coincidencias exactas deben ser selectivas. Para reducir el número de claves de índice escaneadas, asegúrese de que las pruebas de igualdad eliminen al menos el 90% de las posibles coincidencias de documentos.

"Ordenar" determina el orden de los resultados. La ordenación se realiza después de las coincidencias de igualdad, ya que estas reducen la cantidad de documentos que deben ordenarse. Además, la ordenación después de las coincidencias de igualdad permite a MongoDB realizar una ordenación sin bloqueo.

Un índice puede admitir operaciones de ordenación cuando los campos de consulta son un subconjunto de las claves de índice. Las operaciones de ordenación en un subconjunto de las claves de índice solo son compatibles si la consulta incluye condiciones de igualdad para todas las claves de prefijo que preceden a las claves de ordenación. Para obtener más información, consulta Subconjunto de ordenación y sin prefijo de un índice.

El siguiente ejemplo consulta la colección cars. La salida está ordenada por model:

db.cars.find( { manufacturer: "GM" } ).sort( { model: 1 } )

Para mejorar el rendimiento de query, crea un índice en los campos manufacturer y model:

db.cars.createIndex( { manufacturer: 1, model: 1 } )
  • manufacturer es la primera clave porque es una coincidencia exacta.

  • model se indexa en el mismo orden ( 1 ) que la query.

Campos de escaneo de filtros de "rango". El escaneo no requiere una coincidencia exacta, lo que significa que los filtros de rango están vinculados de manera flexible a las claves de índice. Para mejorar la eficiencia de las consultas, limita los límites del rango y utiliza coincidencias exactas para reducir el número de documentos a escanear.

Los filtros de rango son similares a lo siguiente:

db.cars.find( { price: { $gte: 15000} } )
db.cars.find( { age: { $lt: 10 } } )
db.cars.find( { priorAccidents: { $ne: null } } )

MongoDB no puede realizar una ordenación indexada en los resultados de un filtro de rango. Coloque el filtro de rango después del predicado de ordenación para que MongoDB pueda usar una ordenación indexada sin bloqueo. Para obtener más información sobre ordenamientos bloqueantes, consulta cursor.allowDiskUse().

  • Los operadores de desigualdad tales como $ne o $nin son operadores de rango, no operadores exactos.

  • $regex es un operador de rango.

  • $in:

    • Cuando $in se usa solo, es un operador de igualdad que realiza una serie de coincidencias exactas.

    • Cuando $in se usa con .sort():

      • Si $in tiene menos de 200 elementos en el arreglo, los elementos se expanden y luego se fusionan en el orden de clasificación especificado para el índice. Esto mejora el rendimiento para arreglos pequeños. $in es similar a un predicado de igualdad con ESR.

      • Si $in tiene 200 elementos o más, los elementos se ordenan como un operador de rango. En este escenario, la mejora del rendimiento para arreglos pequeños no se realiza. No es posible que los siguientes campos del índice proporcionen un orden, y $in es similar a un predicado de rango con ESR.

      • Si normalmente utilizas $ins con arreglos pequeños, incluye $ins antes en la especificación del índice. Si normalmente usas arreglos grandes, incluye $ins donde incluirías un predicado de rango.

Nota

El límite de 200 está sujeto a cambios y no se garantiza que permanezca igual en todas las versiones de MongoDB.

La siguiente query busca la colección cars de vehículos fabricados por Ford que cuesten más de 15.000 USD. Los resultados están clasificados por modelo:

db.cars.find(
{
manufacturer: 'Ford',
cost: { $gt: 15000 }
} ).sort( { model: 1 } )

La query contiene todos los elementos de la Reglas ESR:

  • manufacturer: 'Ford' es una coincidencia basada en igualdad

  • cost: { $gt: 15000 } es una coincidencia basada en un rango, y

  • model se utiliza para la clasificación

Siguiendo la regla ESR, el índice óptimo para la query de ejemplo es:

{ manufacturer: 1, model: 1, cost: 1 }

Varias ponencias en conferencias de MongoDB abordan la regla ESR en profundidad.

Volver

Strategies

En esta página