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á deshabilitada por defecto y la intersección de índices basada en ordenación no se recomienda en la selección de planes. El optimizador actúa de esta manera para evitar una selección de planes incorrecta.
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 múltiples índices para resolver consultas. Generalmente, cada intersección de índice involucra dos índices; sin embargo, MongoDB puede emplear intersecciones de índices múltiples o anidadas para resolver una consulta.
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,explain() ejecute; los resultados de explain() incluirán una AND_SORTED etapa o una AND_HASH etapa.
Intersección del prefijo del índice
Con la intersección de índices, MongoDB puede usar la intersección de todo el índice o de su prefijo. Un prefijo es un subconjunto de un índice compuesto, compuesto por una o más claves 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 con la siguiente consulta que especifica una condición tanto en el campo qty como en el campo status, MongoDB puede usar la intersección de los dos índices:
db.orders.find( { qty: { $gt: 10 } , status: "A" } )
Intersección de índices e índices compuestos
La intersección de índices no elimina la necesidad de crear índices compuestos. Sin embargo, dado que tanto el orden de lista (es decir, el orden en que se listan las claves en el índice) como el orden de ordenación (ascendente o descendente) son importantes en los índices compuestos, es posible que un índice compuesto no admita una condición de consulta que no incluya las claves de prefijo del índice o que especifique un orden de ordenación diferente.
Nota
Para las implementaciones alojadas en MongoDB Atlas, considere usar índices de búsqueda de Atlas 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 enumerado antes del campo ord_date:
{ status: 1, ord_date: -1 }
El índice compuesto puede admitir 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, ya sea individualmente o mediante 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.
Intersección y orden de índices
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 consulta con ordenación, ya que el índice { status: 1, ord_date: -1 } puede cumplir parte del predicado de la consulta.
db.orders.find( { qty: { $gt: 10 } , status: "A" } ).sort( { ord_date: -1 } )
Intersección de índices e índices de búsqueda de Atlas
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:
Especifique un orden de clasificación diferente al orden de clasificación del índice.
Contiene 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: