Une opération de requête telle que spécifiée dans la documentation DynamoDb:
Une opération d'interrogation recherche uniquement les valeurs d'attribut de clé primaire et prend en charge un sous-ensemble d'opérateurs de comparaison sur les valeurs d'attribut de clé pour affiner le processus de recherche.
et l'opération de numérisation:
Une opération d'analyse analyse toute la table. Vous pouvez spécifier des filtres à appliquer aux résultats pour affiner les valeurs renvoyées après l'analyse complète.
Ce qui est le mieux basé sur les considérations de performance et de coût.
Vous rencontrez la clé de partition de table dynamodb/la clé primaire en tant que customer_country
. Si vous utilisez la requête, customer_country
est le champ obligatoire pour effectuer une opération de requête. Tous les filtres ne peuvent être faits que des éléments appartenant à customer_country
.
Si vous effectuez une analyse de table, le filtre sera appliqué à toutes les clés de partition/clés primaires. Tout d'abord, il récupère toutes les données et applique le filtre après l'extraction de la table.
ici customer_country
est le clé de partition/clé primaire et id
est le sort_key
-----------------------------------
customer_country | name | id
-----------------------------------
VV | Tom | 1
VV | Jack | 2
VV | Mary | 4
BB | Nancy | 5
BB | Lom | 6
BB | XX | 7
CC | YY | 8
CC | ZZ | 9
------------------------------------
Si vous effectuez une opération de requête, cela ne s'applique que sur customer_country
valeur. La valeur ne doit être qu'opérateur égal (=).
Ainsi, seuls les éléments égaux à cette clé de partition/valeur de clé primaire sont récupérés.
Si vous effectuez une opération d'analyse, il extrait tous les éléments de cette table et filtre les données une fois qu'elles ont été traitées.
Remarque: N'effectuez pas d'analyse car votre RCU dépasse.
Lors de la création d'une table Dynamodb, sélectionnez Clés principales et Index secondaires locaux (LSI) afin qu'une opération de requête retourne les éléments souhaités.
Les opérations de requête ne prennent en charge qu'une évaluation identique de l'opérateur de la clé primaire, mais conditionnelle (=, <, <=,>,> =, entre, début) sur la clé de tri.
Les opérations d'analyse sont généralement plus lentes et plus coûteuses car l'opération doit parcourir chaque élément de votre table pour obtenir les éléments que vous demandez.
Exemple:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
Dans cet exemple, vous pouvez utiliser une opération de requête pour obtenir:
Une opération de numérisation doit être utilisée pour renvoyer:
Pour éviter les opérations de numérisation sur les opérations fréquemment utilisées créant un index secondaire local (LSI) ou un index secondaire global (GSI).
Exemple:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
Dans cet exemple, une opération de requête peut vous permettre d’obtenir:
En termes de performances, je pense que c'est une bonne pratique de concevoir votre table pour que les applications utilisent Query
au lieu de Scan
. Dans la mesure où une opération d'analyse analyse toujours l'intégralité de la table avant de filtrer les valeurs souhaitées, le traitement des opérations de données telles que la lecture, l'écriture et la suppression prend plus de temps et d'espace. Pour plus d'informations, veuillez vous référer à le document officiel
Query est beaucoup mieux que Scan - performance sage. scan, comme son nom l'indique, va scanner toute la table. Cependant, vous devez bien connaître la clé de table, la clé de tri, les index et les index de tri associés, afin de savoir que vous pouvez utiliser la requête. si vous filtrez votre requête en utilisant:
utilisez Query! sinon utilisez scan qui est plus flexible sur les colonnes que vous pouvez filtrer.
vous ne pouvez PAS interroger si:
une bonne explication: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f
Son semblable à celui de la base de données relationnelle.
Obtenez query
vous utilisez une clé primaire dans where
condition, la complexité de calcul est log(n)
, car la structure de clé la plus grande partie est un arbre binaire.
alors que scan
requête vous devez analyser toute la table puis appliquer un filtre sur chaque row
pour trouver le bon résultat. La performance est O(n)
. C'est beaucoup plus lent si votre table est grande.
En bref, essayez d'utiliser get
si vous connaissez la clé primaire. seulement scan
pour le pire des cas.
Pensez également à l'index secondaire global pour prendre en charge un type différent de requêtes sur différentes clés pour atteindre un objectif de performance.