Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/
Manual de base de datos
/

Intersección de Índices

Importante

Esta página documenta casos donde optimizador del query podría utilizar la intersección de índices.

En la práctica, el optimizador del query rara vez selecciona planes que usen intersección de índices.

La intersección de índices basada en hash está desactivada por defecto y la intersección de índices basada en ordenación no se prefiere en la selección de planes. El optimizador se comporta de esta manera para evitar la selección de un plan inadecuado.

Los diseños de esquema no deben depender de la intersección de índices. En cambio, debe usarse índices compuestos.

Las futuras mejoras en el optimizador del query pueden permitir que el sistema identifique mejor los casos en los que un plan de intersección de índices sería beneficioso.

MongoDB puede usar la intersección de varios índices para cumplir con las consultas. En general, cada intersección de índice involucra dos índices; sin embargo, MongoDB puede emplear intersecciones de índices múltiples/anidadas para resolver una query.

Para ilustrar la intersección de índices, considera una colección orders que tiene los siguientes índices:

{ qty: 1 }
{ item: 1 }

MongoDB puede usar la intersección de los dos índices para dar soporte a la siguiente query:

db.orders.find( { item: "abc123", qty: { $gt: 15 } } )

Para determinar si MongoDB utilizó la intersección de índices, ejecute explain(); los resultados de explain() incluirán una etapa AND_SORTED o una etapa AND_HASH.

Con la intersección de índices, MongoDB puede utilizar una intersección de todo el índice o del prefijo del índice. Un prefijo de índice es un subconjunto de un índice compuesto que consta de una o más llaves que comienzan desde el principio del índice.

Considera una colección orders con los siguientes índices:

{ qty: 1 }
{ status: 1, ord_date: -1 }

Para cumplir la siguiente query que especifica una condición en el campo qty y en el campo status, MongoDB puede utilizar la intersección de los dos índices:

db.orders.find( { qty: { $gt: 10 } , status: "A" } )

La intersección de índices no elimina la necesidad de crear índices compuestos. Sin embargo, debido a que tanto el orden de la lista (es decir, el orden en que las claves figuran en el índice) como el orden de clasificación (es decir, ascendente o descendente), importa en los índices compuestos, un índice compuesto puede no admitir una condición de query que no incluya las claves prefijo del índice o que especifique un orden de clasificación diferente.

Nota

Para implementaciones hospedadas en MongoDB Atlas, considere usar índices Atlas Search para evitar limitaciones debido al orden de los campos.

Por ejemplo, si una colección orders tiene el siguiente índice compuesto, con el campo status antes del campo ord_date:

{ status: 1, ord_date: -1 }

El índice compuesto puede soportar las siguientes consultas:

db.orders.find( { status: { $in: ["A", "P" ] } } )
db.orders.find(
{
ord_date: { $gt: new Date("2014-02-01") },
status: {$in:[ "P", "A" ] }
}
)

Pero no las siguientes dos queries:

db.orders.find( { ord_date: { $gt: new Date("2014-02-01") } } )
db.orders.find( { } ).sort( { ord_date: 1 } )

Sin embargo, si la colección tiene dos índices separados:

{ status: 1 }
{ ord_date: -1 }

Los dos índices pueden, tanto individualmente como a través de la intersección de índices, admitir las cuatro consultas mencionadas anteriormente.

La elección entre crear índices compuestos que den soporte a tus queries o confiar en la intersección de índices depende de las particularidades de tu sistema.

Tip

La intersección de índices no se aplica cuando la operación sort() requiere un índice completamente separado del predicado de la query.

Por ejemplo, la colección orders tiene los siguientes índices:

{ qty: 1 }
{ status: 1, ord_date: -1 }
{ status: 1 }
{ ord_date: -1 }

MongoDB no puede utilizar la intersección de índices para la siguiente query con ordenamiento:

db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )

Es decir, MongoDB no utiliza el índice { qty: 1 } para la query, ni el índice { status: 1 } independiente ni el índice { status: 1, ord_date: -1 } para el ordenamiento.

Sin embargo, MongoDB puede utilizar la intersección de índices para la siguiente query con ordenamiento, ya que el índice { status: 1, ord_date: -1 } puede cumplir con parte del predicado de la query.

db.orders.find( { qty: { $gt: 10 } , status: "A" } ).sort( { ord_date: -1 } )

Si usas MongoDB Atlas, puedes crear un índice de búsqueda Atlas para atender queries cuando el optimizador del query seleccione un plan que implique intersección de índices. A diferencia de los índices compuestos, los campos en los índices de Atlas Search pueden definirse en cualquier orden. Como resultado, el índice de búsqueda Atlas puede soportar consultas que:

  • Especifica un orden de clasificación diferente al de la ordenación indexada.

  • Contienen campos que no forman parte del prefijo del índice.

Nota

Los índices de búsqueda de Atlas solo están disponibles para clústeres de MongoDB Atlas y no están habilitados para implementaciones autogestionadas. Para obtener más información, consulta:

Volver

Crea en clústeres particionados

En esta página