Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Les clés DynamoDB : requête ou scan

Après cette leçon: Je peux dire pourquoi une requête coûte moins qu’un scan.

Leçon de 55 minAucune commande

Lire tout un million de commandes ?

Une boutique en ligne garde un million de commandes. Une cliente veut voir les siennes. La boutique lit-elle le million pour les trouver ?

Une bonne table DynamoDB ne le fait pas. Une requête va droit aux commandes de la cliente et ne lit rien d’autre. Cette leçon montre pourquoi une requête coûte moins qu’un scan, et comment lire les compteurs que le service renvoie.

À la fin de cette leçon

Remarque

Je peux dire pourquoi une requête coûte moins qu’un scan.

Mots-clés

MotCe que ça veut direExemple
Clé de partitionl’attribut qui décide où un élément est rangé
Clé de tril’attribut qui met les éléments dans l’ordre, à l’intérieur d’une clé de partition
Condition de cléle test qu’une requête fait sur les clés
Requêteune lecture qui va vers une seule clé de partitionquery
Scanune lecture qui regarde chaque élément de la table
Filtreun test appliqué après la lecture des éléments

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Deux clés donnent une adresse à chaque élément

Notre table de commandes a deux attributs clés. La clé de partition est client. Elle décide où le service range un élément, donc toutes les commandes d’un même client sont ensemble.

La clé de tri est numero_commande. Elle met en ordre les commandes d’un client. Ensemble, les deux clés désignent un seul élément. Deux commandes peuvent avoir le même client, mais jamais les deux mêmes clés.

Exemple travaillé : le rangement des commandes

Clé de partition : clientClé de tri : numero_commandeAutres attributs
ana1thé, payée, total 4
ana2lait, nouvelle, total 2
ana3gâteau, payée, total 15
ben7thé, payée, total 8
cai4lait, nouvelle, total 6
cai9thé, payée, total 3

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Requête : un endroit, scan : partout

Une requête nomme la clé de partition. Elle le doit, sinon le service refuse avec une ValidationException et le statut HTTP 400. Le service va droit à ce client et ne lit que ses commandes.

Un scan ne nomme rien. Il lit chaque élément de la table, l’un après l’autre. Les deux réponses portent un Count, le nombre d’éléments renvoyés, et un ScannedCount, le nombre d’éléments regardés.

Essayez : une requête et un scan

Code: python
commandes = [
    {"client": {"S": "ana"}, "numero_commande": {"N": "1"}, "statut": {"S": "payée"}},
    {"client": {"S": "ana"}, "numero_commande": {"N": "2"}, "statut": {"S": "nouvelle"}},
    {"client": {"S": "ana"}, "numero_commande": {"N": "3"}, "statut": {"S": "payée"}},
    {"client": {"S": "ben"}, "numero_commande": {"N": "7"}, "statut": {"S": "payée"}},
    {"client": {"S": "cai"}, "numero_commande": {"N": "4"}, "statut": {"S": "nouvelle"}},
    {"client": {"S": "cai"}, "numero_commande": {"N": "9"}, "statut": {"S": "payée"}},
]

def faire_scan(elements):
    return {"Count": len(elements), "ScannedCount": len(elements)}

def faire_requete(elements, client):
    trouves = []
    for element in elements:
        if element["client"]["S"] == client:
            trouves.append(element)
    return {"Count": len(trouves), "ScannedCount": len(trouves)}

print("scan :", faire_scan(commandes))
print("requête ana :", faire_requete(commandes, "ana"))
# Remplacez "ana" par "ben". Combien d’éléments la requête regarde-t-elle maintenant ?

Un filtre réduit la réponse, pas le travail

Une condition de clé peut aussi tester la clé de tri. Par exemple, un numero_commande de 2 ou plus. Le service ne lit alors que cette partie de la partition.

Un filtre teste un autre attribut, comme le statut. Il s’applique après la lecture des éléments, donc il change le Count mais pas le ScannedCount.

Exemple : les commandes payées d’ana, dès la 2

ÉtapeÉléments restantsCe qui s’est passé
La clé de partition est ana3les commandes 1, 2 et 3
Clé de tri de 2 ou plus2les commandes 2 et 3, donc ScannedCount vaut 2
Filtre : le statut est payée1la commande 3 seule, donc Count vaut 1

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Erreur fréquente

Attention

Beaucoup croient qu’un filtre rend une lecture moins chère. Ce n’est pas vrai. Le service lit les éléments d’abord et en écarte après. Mettez dans la condition de clé tout ce que vous pouvez, et gardez le filtre pour le reste.

Essayez : lire les deux compteurs

Code: python
reponse = {
    "Count": 1,
    "ScannedCount": 2,
    "Items": [
        {"client": {"S": "ana"}, "numero_commande": {"N": "3"}, "statut": {"S": "payée"}},
    ],
}

ecartes = reponse["ScannedCount"] - reponse["Count"]
print("regardés :", reponse["ScannedCount"])
print("renvoyés :", reponse["Count"])
print("écartés par le filtre :", ecartes)
# Remplacez ScannedCount par 3. Combien d’éléments le filtre a-t-il écartés ?

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.