Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Index-only escaneos (consultas cubiertas)
Un escaneo solo de índices (también denominado consulta cubierta) es una optimización en la que Amazon DocumentDB responde a una consulta en su totalidad a partir de los campos almacenados en un índice, sin leer los documentos subyacentes. Como los valores que necesita una consulta ya están presentes en el índice, Amazon DocumentDB puede omitir la búsqueda de todos los documentos coincidentes, lo que evita el coste aleatorio I/O y de decodificación que supone leer documentos completos. En el plan de consultas, aparece como IXONLYSCAN etapa un escaneo que solo incluya índices, en lugar de un escaneo (escaneo de índices) o IXSCAN COLLSCAN (escaneo de colección). Esto reduce I/O y puede reducir considerablemente la latencia de las consultas compatibles.
Una consulta es una buena opción para un escaneo que solo incluya índices cuando solo toque un número reducido de campos que estén todos en un mismo índice, especialmente cuando los documentos en sí son grandes. Algunos ejemplos comunes son los paneles, los resúmenes de análisis y las búsquedas que leen algunos campos de un índice compuesto más amplio.
Los resultados de una consulta son los mismos independientemente de que se utilice o no un análisis que solo contenga índices. Solo cambian el plan de consulta y la cantidad I/O que realiza.
nota
Index-only la compatibilidad con el escaneo depende de la versión del motor de Amazon DocumentDB:
-
findLas proyecciones cubiertas que incluyen más de una proyección que no es de_idcampo requieren la versión 8.0.2 o posterior del motor. En versiones anteriores, unafindproyección cubierta podía incluir como máximo una proyección que no fuera de_idcampo. Una proyección con dos o más campos vuelve a ser un escaneo de índice o de colección normal. -
Index-only los análisis en busca de canales de agregación, como los cubiertos
$group, requieren la versión 8.0.2 o posterior del motor.
Cuando Amazon DocumentDB utiliza un escaneo que solo incluye índices
Amazon DocumentDB considera la posibilidad de escanear solo índices para las siguientes operaciones cuando un índice único contiene todos los campos que lee la operación.
Proyecciones de búsqueda cubiertas
Una find consulta cumple los requisitos cuando su proyección es una simple inclusión de uno o más campos de nivel superior y todos los campos proyectados están presentes en un único índice. Por ejemplo, si el índice compuesto está activado{ customerId: 1, status: 1, total: 1 }, se incluye la siguiente consulta. Los tres campos proyectados se encuentran en el índice y _id se excluyen explícitamente. (Para cubrir una proyección con más de un campo que no sea un _id campo, se requiere la versión 8.0.2 o posterior del motor).
db.orders.createIndex({ customerId: 1, status: 1, total: 1 }) db.orders.find( { customerId: 42 }, { _id: 0, customerId: 1, status: 1, total: 1 } )
El plan ganador utiliza un IXONLYSCAN escenario y nunca saca del almacén los documentos correspondientes:
{ "stage": "IXONLYSCAN", "indexName": "customerId_1_status_1_total_1", "direction": "forward", "indexCond": { "$and": [ { "customerId": { "$eq": 42 } } ] } }
nota
En una find consulta cubierta, los campos del resultado se devuelven en orden de índice (el orden en que aparecen los campos en la definición del índice), no en el orden en que se enumeraron en la proyección ni en el orden en que se almacenaron en el documento. Esto coincide con el comportamiento de MongoDB en las consultas cubiertas. En cambio, una consulta a la que se responde mediante un escaneo de la colección devuelve los campos en el orden de los documentos almacenados.
Se cubrieron las agregaciones de $group
Por lo general, una $group etapa lee solo unos pocos campos (la clave del grupo y las entradas de sus acumuladores), pero a menudo se ejecuta sin un encabezado. $match Sin un índice que lo cubra, Amazon DocumentDB lee y decodifica todos los documentos completos de la colección solo para incluir esos pocos campos en la agrupación.
Index-only Los análisis para detectar las canalizaciones de agregación, incluidas $group las etapas cubiertas, están disponibles en la versión 8.0.2 y posteriores del motor.
Cuando un solo índice contiene todos los campos que lee el prefijo de la canalización, Amazon DocumentDB puede colocar un escaneo solo para índices debajo del grupo y leer esos campos directamente desde el índice. Pensemos en una canalización que agrupa los pedidos por estado y suma sus totales, con un índice compuesto sobre: { status: 1, total: 1 }
db.orders.createIndex({ status: 1, total: 1 }) db.orders.aggregate([ { $group: { _id: "$status", revenue: { $sum: "$total" } } } ])
La canalización es de solo lectura status ytotal, al estar ambas en el índice, el grupo se alimenta a partir de un escaneo IXONLYSCAN en lugar de un registro:
// Without a covering index $group <- COLLSCAN (reads and decodes every full document) // With a covering index on { status, total } $group <- IXONLYSCAN over { status, total } (reads only the referenced fields)
Se admite un $sort encabezado $match$skip,, o $limit antes del$group. Sin embargo, todos los campos a los que hacen referencia estas etapas (por ejemplo, un campo de $match filtro o una $sort clave) también deben estar presentes en el mismo índice para cubrir la canalización. Si falta algún campo al que se hace referencia en el índice, Amazon DocumentDB recurre a un escaneo de recopilación o índice.
nota
A diferencia de una find proyección, a $group no incluye el documento de forma implícita. _id _idEn a $group es la clave del grupo, no el identificador del documento, por lo que no es necesario que el índice contenga el documento _id para cubrir el proceso.
Requisitos para una consulta cubierta
Para que Amazon DocumentDB utilice un escaneo que solo incluya índices, se deben cumplir todos los siguientes requisitos:
-
Un único índice contiene todos los campos que lee la consulta. Esto incluye los campos proyectados y la clave de grupo, las entradas del acumulador y cualquier campo de filtro u clasificación para una canalización cubierta
$group.findSi falta un solo campo en el índice, la consulta no se puede cubrir. -
La proyección es una inclusión de campos de nivel superior (para
find). Las proyecciones de exclusión, los campos calculados y los operadores de proyección, como$slicey, no$elemMatchson aptos. -
El
_idcampo está contabilizado (parafind). Como_idse incluye de forma predeterminada, un índice compuesto común, por ejemplo,{ a: 1, b: 1 }no cubrefind({}, { a: 1, b: 1 }): lo implícito no_idestá en el índice. Puede excluirlo_idde la proyección ({ _id: 0, a: 1, b: 1 }) o añadirlo_idal índice. -
El índice cumple plenamente con el filtro. Si Amazon DocumentDB no puede convertir parte del predicado de consulta en un enlace a un índice, conserva esa parte como filtro residual, lee el documento para evaluarlo y no convierte el escaneo en un escaneo solo para índices. Los operadores como
$mod,$ne$nin, y$existsdejan un filtro residual. -
Ningún campo proyectado es una columna de varias claves (matriz). Consulte Restricciones.
Restricciones
En los siguientes casos, no se puede usar un escaneo solo de índices y volver a un escaneo de índice o colección normal. Este es el comportamiento esperado y nunca afecta a la exactitud de los resultados.
-
Campos multiclave (matriz). Si un campo ha mantenido alguna vez un valor de matriz en algún documento, su columna de índice es de varias claves. Un índice de varias claves almacena una entrada por elemento de la matriz, por lo que la matriz original no se puede reconstruir a partir del índice. No se incluye ninguna consulta que lea un campo de este tipo.
-
Rutas punteadas o anidadas. Una proyección o una referencia de campo en una ruta anidada como, por ejemplo, no
"address.city"es apta, incluso si el índice contiene esa ruta. -
Proyecciones de exclusión, calculadas o de operadores. Las proyecciones como
{ b: 0 }{ total: { $add: ["$price", "$tax"] } }, o{ a: { $slice: 5 } }requieren el documento completo y no están cubiertas. -
Whole-document referencias agregadas. No
$groupse puede incluir una referencia a todo el documento (por ejemplo,{ $push: "$$ROOT" }), porque ningún índice puede reconstruir todo el documento. -
La remodelación de las etapas anteriores.
$groupUna etapa que cambia la forma de los documentos (como$project,$addFields$unwind, o$lookup) que aparecen antes de que$groupdescalifique al oleoducto para que no pueda cubrirse. -
La intercalación no coincide en los predicados de cadenas. Si la intercalación de la consulta difiere de la intercalación del índice, el índice no puede mostrar los predicados de cadena y deja un filtro residual, lo que obliga a buscar un documento. Los predicados numéricos y basados en tipos no se ven afectados.
Confirmación de un análisis que solo incluye índices
Utilice el explain("executionStats") resultado para confirmar que la consulta se ha realizado mediante un escaneado que solo contiene índices y que no afecta a los documentos. Busque dos cosas:
-
El plan ganador usa el
IXONLYSCANescenario. -
El
docsExaminedvalor de esa etapa es0(ytotalDocsExaminedes0), lo que significa que la consulta se respondió en su totalidad desde el índice sin leer ningún documento.
db.orders.find( { customerId: 42 }, { _id: 0, customerId: 1, status: 1, total: 1 } ).explain("executionStats").executionStats
{ "executionSuccess": true, "nReturned": "2", "executionTimeMillis": "0.714", "totalDocsExamined": "0", "executionStages": { "stage": "IXONLYSCAN", "nReturned": "2", "indexName": "customerId_1_status_1_total_1", "direction": "forward", "docsExamined": "0" } }
nota
Un docsExamined valor distinto de cero en un IXONLYSCAN escenario significa que el índice contenía los datos, pero Amazon DocumentDB siguió comprobando el almacenamiento para confirmar que cada versión del documento estaba visible. Esto puede ocurrir cuando la colección contiene escrituras recientes cuyas versiones obsoletas del documento no se han recuperado todavía. Una vez que la recolección de basura procesa esos documentos, docsExamined pasa a0. En ese momento, la consulta se da cuenta de todos los beneficios del escaneo cubierto. Para obtener más información sobre la recolección de basura, consulteRecopilación de elementos no utilizados en Amazon DocumentDB. Para obtener más información acerca de la métrica docsExamined, consulte Análisis del plan de consultas.
Prácticas recomendadas
-
Diseñe índices compuestos que contengan los campos en los que proyectan o agrupan sus consultas más frecuentes, de modo que esas consultas puedan cubrirse.
-
Excluya
_iddefindlas proyecciones ({ _id: 0, ... }) a menos que_idforme parte del índice de cobertura. -
Evite indexar campos de matriz (con varias claves) cuando pretenda cubrir una consulta, ya que las columnas con varias claves descalifican la ruta que solo contiene índices.
-
Permita que la recolección de basura esté a la altura de su carga de trabajo de escritura, de modo que los escaneos cubiertos eviten el acceso a los documentos y se queden así.
docsExamined0Para obtener más información, consulte Recopilación de elementos no utilizados en Amazon DocumentDB.