Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Index-only scans (requêtes couvertes)
Un scan d'index uniquement (également appelé requête couverte) est une optimisation dans laquelle Amazon DocumentDB répond à une requête entièrement à partir des champs stockés dans un index, sans lire les documents sous-jacents. Étant donné que les valeurs dont une requête a besoin sont déjà présentes dans l'index, Amazon DocumentDB peut ignorer la récupération de chaque document correspondant, évitant ainsi les coûts aléatoires I/O et de décodage liés à la lecture de documents complets. Dans le plan de requête, une analyse d'index uniquement apparaît comme IXONLYSCAN étape au lieu d'une IXSCAN (analyse d'index) ou d'une COLLSCAN (analyse de collection). Cela permet de réduire I/O et de réduire de manière significative la latence des requêtes prises en charge.
Une requête est un bon candidat pour une analyse d'index uniquement lorsqu'elle ne touche qu'un petit nombre de champs qui existent tous dans un seul index, en particulier lorsque les documents eux-mêmes sont volumineux. Les tableaux de bord, les cumuls analytiques et les recherches qui lisent quelques champs d'un index composé plus large en sont des exemples courants.
Les résultats d'une requête sont les mêmes, qu'une analyse par index uniquement soit utilisée ou non. Seuls le plan de requête et son volume I/O d'exécution sont modifiés.
Note
Index-only la prise en charge de la numérisation dépend de la version de votre moteur Amazon DocumentDB :
-
Les
findprojections couvertes qui incluent plusieurs éléments non liés à un_idchamp nécessitent la version 8.0.2 ou ultérieure du moteur. Dans les versions précédentes, unefindprojection couverte pouvait inclure au plus un élément hors_idchamp. Une projection comportant deux champs ou plus revient à une analyse d'index normale ou à une analyse de collection. -
Index-only les analyses des pipelines d'agrégation, tels que Covered
$group, nécessitent la version 8.0.2 ou ultérieure du moteur.
Quand Amazon DocumentDB utilise une analyse par index uniquement
Amazon DocumentDB envisage une analyse d'index uniquement pour les opérations suivantes lorsqu'un index unique contient tous les champs lus par l'opération.
Projections couvertes
Une find requête est qualifiée lorsque sa projection est une simple inclusion d'un ou de plusieurs champs de niveau supérieur et que chaque champ projeté est présent dans un index unique. Par exemple, étant donné un index composé activé{ customerId: 1, status: 1, total: 1 }, la requête suivante est couverte. Les trois champs projetés sont inclus dans l'indice et _id sont explicitement exclus. (La couverture d'une projection comportant plusieurs éléments autres que des _id champs nécessite la version 8.0.2 ou ultérieure du moteur.)
db.orders.createIndex({ customerId: 1, status: 1, total: 1 }) db.orders.find( { customerId: 42 }, { _id: 0, customerId: 1, status: 1, total: 1 } )
Le plan gagnant utilise une IXONLYSCAN étape et ne récupère jamais les documents correspondants depuis le stockage :
{ "stage": "IXONLYSCAN", "indexName": "customerId_1_status_1_total_1", "direction": "forward", "indexCond": { "$and": [ { "customerId": { "$eq": 42 } } ] } }
Note
Dans une find requête couverte, les champs du résultat sont renvoyés dans l'ordre d'index (l'ordre dans lequel les champs apparaissent dans la définition de l'index), et non dans l'ordre dans lequel ils ont été répertoriés dans la projection ou dans l'ordre dans lequel ils sont stockés dans le document. Cela correspond au comportement de MongoDB pour les requêtes couvertes. Une requête à laquelle répond une analyse de collection renvoie plutôt les champs dans l'ordre des documents stockés.
Agrégations de groupes de dollars couvertes
Un $group stage ne lit généralement que quelques champs (la touche de groupe et les entrées de ses accumulateurs) mais est souvent exécuté sans fil. $match Sans index de couverture, Amazon DocumentDB lit et décode tous les documents complets de la collection juste pour intégrer ces quelques champs au regroupement.
Index-only les analyses des pipelines d'agrégation, y compris $group les étapes couvertes, sont disponibles dans les versions 8.0.2 et ultérieures du moteur.
Lorsqu'un index contient tous les champs lus par le préfixe du pipeline, Amazon DocumentDB peut effectuer une analyse d'index uniquement sous le groupe et lire ces champs directement à partir de l'index. Prenons l'exemple d'un pipeline qui regroupe les commandes par statut et fait la somme de leurs totaux, avec un indice composé sur { status: 1, total: 1 } :
db.orders.createIndex({ status: 1, total: 1 }) db.orders.aggregate([ { $group: { _id: "$status", revenue: { $sum: "$total" } } } ])
Le pipeline ne lit que status ettotal, les deux étant dans l'index, le groupe est alimenté à partir d'un scan IXONLYSCAN plutôt que d'un scan de collecte :
// 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)
Un leader$match,, $sort$skip, ou $limit avant que $group est pris en charge. Cependant, chaque champ auquel ces étapes font référence (par exemple, un champ de $match filtre ou une $sort clé) doit également être présent dans le même index pour que le pipeline soit couvert. Si un champ référencé est absent de l'index, Amazon DocumentDB revient à une analyse de collection ou d'index.
Note
Contrairement à une find projection, a $group n'inclut pas implicitement le document_id. La _id valeur in a $group est la clé de groupe et non l'identifiant du document. L'index n'a donc pas besoin de contenir le document _id pour couvrir le pipeline.
Exigences relatives à une requête couverte
Pour qu'Amazon DocumentDB utilise une analyse par index uniquement, tous les éléments suivants doivent être remplis :
-
Un index unique contient tous les champs lus par la requête. Cela inclut les champs projetés pour
find, la clé de groupe, les entrées de l'accumulateur et tous les champs de filtrage ou de tri pour un$grouppipeline couvert. Si ne serait-ce qu'un seul champ est absent de l'index, la requête ne peut pas être traitée. -
La projection inclut les champs de niveau supérieur (pour
find). Les projections d'exclusion, les champs calculés et les opérateurs de projection tels que$sliceet ne$elemMatchsont pas éligibles. -
Le
_idchamp est comptabilisé (pourfind). Parce qu'_idil est inclus par défaut, un indice composé commun tel que{ a: 1, b: 1 }ne couvre pasfind({}, { a: 1, b: 1 }): l'implicite n'_idest pas dans l'index. Exclure_idde la projection ({ _id: 0, a: 1, b: 1 }) ou ajouter_idà l'index. -
Le filtre est entièrement satisfait par l'indice. Si Amazon DocumentDB ne peut pas transformer une partie du prédicat de requête en limite d'index, il conserve cette partie en tant que filtre résiduel, lit le document pour l'évaluer et ne convertit pas le scan en un scan indexé uniquement. Les opérateurs tels que
$mod$ne,$nin, et$existslaissent un filtre résiduel. -
Aucun champ projeté n'est une colonne multiclé (tableau). Consultez Restrictions.
Restrictions
Les cas suivants ne peuvent pas utiliser une analyse d'index uniquement et revenir à une analyse d'index normale ou à une analyse de collection. Ce comportement est normal et n'affecte jamais l'exactitude des résultats.
-
Champs multiclés (tableau). Si un champ a déjà contenu une valeur de tableau dans un document, sa colonne d'index est multiclé. Un index multiclé stocke une entrée par élément du tableau, de sorte que le tableau d'origine ne peut pas être reconstruit à partir de l'index. Toute requête qui lit un tel champ n'est pas prise en compte.
-
Chemins en pointillés ou imbriqués. Une projection ou une référence de champ sur un chemin imbriqué tel que n'
"address.city"est pas éligible, même si l'index contient ce chemin. -
Projections d'exclusion, calculées ou réalisées par des opérateurs. Les projections telles que
{ b: 0 }{ total: { $add: ["$price", "$tax"] } }, ou{ a: { $slice: 5 } }nécessitent le document complet et ne sont pas couvertes. -
Whole-document références dans l'agrégation. Un
$groupqui fait référence à l'intégralité du document (par exemple{ $push: "$$ROOT" }) ne peut pas être couvert, car aucun index ne peut reconstruire l'intégralité du document. -
Les étapes précédentes de remodelage.
$groupÉtape qui remodèle les documents (tels que$project,$addFields$unwind, ou$lookup) apparaissant avant que le pipeline ne soit$groupexclu de la couverture. -
Incompatibilité de classement sur les prédicats de chaîne. Si le classement de la requête diffère de celui de l'index, les prédicats de chaîne ne peuvent pas être servis par l'index et laissent un filtre résiduel, ce qui force l'extraction du document. Les prédicats numériques et basés sur les types ne sont pas affectés.
Confirmation d'une analyse d'index uniquement
Utilisez le explain("executionStats") résultat pour confirmer qu'une requête est traitée par un scan indexé uniquement et qu'elle ne concerne pas les documents. Recherchez deux choses :
-
Le plan gagnant utilise la
IXONLYSCANscène. -
La
docsExaminedvaleur de cette étape est0(ettotalDocsExaminedest0), ce qui signifie que la requête a été entièrement répondue à partir de l'index sans lire aucun document.
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" } }
Note
Une docsExamined valeur différente de zéro sur une IXONLYSCAN étape signifie que l'index contenait les données, mais Amazon DocumentDB a tout de même vérifié le stockage pour confirmer que chaque version du document était visible. Cela peut se produire lorsque la collection contient des écritures récentes dont les versions de documents obsolètes n'ont pas encore été récupérées. Une fois que la collecte des ordures traite ces documents, docsExamined elle passe à0. À ce stade, la requête tire pleinement parti de l'analyse couverte. Pour plus d'informations sur la collecte des déchets, voirCollecte des déchets dans Amazon DocumentDB. Pour plus d’informations sur la métrique docsExamined, consultez Analyse du plan de requêtes.
Bonnes pratiques
-
Concevez des index composés contenant les champs sur lesquels vos requêtes les plus fréquentes sont projetées ou regroupées, afin que ces requêtes puissent être couvertes.
-
Exclure
_iddesfindprojections ({ _id: 0, ... }) sauf si_idcela fait partie de l'indice de couverture. -
Évitez d'indexer les champs de tableau (multiclés) lorsque vous souhaitez qu'une requête soit couverte, car les colonnes multiclés disqualifient le chemin d'index uniquement.
-
Permettez à la collecte des déchets de suivre le rythme de votre charge de travail d'écriture, de sorte que les numérisations couvertes évitent l'accès aux documents et
docsExaminedrestent inchangées0. Pour plus d'informations, consultez Collecte des déchets dans Amazon DocumentDB.