Importante
Esta página documenta casos en los que optimizador del query Es posible que pueda utilizar la intersección de índices.
En la práctica, el optimizador de consultas rara vez selecciona planes que utilizan la 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 esquemas no deben basarse en la intersección de índices. En su lugar, deben utilizarseíndices compuestos.
Las futuras mejoras al optimizador de consultas 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, considere una colección orders que tiene los siguientes índices:
{ qty: 1 } { item: 1 }
MongoDB puede utilizar la intersección de los dos índices para soportar la siguiente consulta:
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.
Considere 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 dos consultas siguientes:
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 ordenación de índices
La intersección de índices no se aplica cuando la sort() operación requiere un índice completamente separado del predicado de consulta.
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 usar la intersección de índices para la siguiente consulta con ordenación:
db.orders.find( { qty: { $gt: 10 } } ).sort( { status: 1 } )
Es decir, MongoDB no utiliza el índice { qty: 1 } para la consulta, y el índice separado { status: 1 } o { status: 1, ord_date: -1
} para la ordenación.
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 } )
Índices de intersección y búsqueda en Atlas
Si usa MongoDB Atlas, puede crear un índice de búsqueda de Atlas para responder a las consultas cuando el optimizador de consultas selecciona un plan que implica la intersección de índices. A diferencia de los índices compuestos, los campos de los índices de búsqueda de Atlas se pueden definir en cualquier orden. Como resultado, el índice de búsqueda de Atlas admite 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.
Para obtener un tutorial sobre el uso de los índices de Atlas Search cuando se requiere la intersección de índices, consulte Consultas flexibles con Atlas Search.
Nota
Los índices de búsqueda de Atlas solo están disponibles para clústeres de MongoDB Atlas y no para implementaciones autogestionadas. Para obtener más información, consulte: