DynamoDb文档中指定的查询操作:
查询操作仅搜索主键属性值,并支持键属性值上的比较运算符的子集,以优化搜索过程。
和扫描操作:
扫描操作将扫描整个表。在完成扫描后,您可以指定要应用于结果的过滤器,以优化返回给您的值。
最好基于性能和成本方面的考虑。
Answers:
创建动态表时,请选择“主键”和“本地二级索引(LSI)”,以便“查询”操作返回所需的项目。
查询操作仅支持对主键进行相等的运算符评估,但对排序键有条件(=,<,<=,>,> =,介于,开始)。
扫描操作通常较慢且较昂贵,因为该操作必须遍历表中的每个项目以获取您要的项目。
例:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
在此示例中,您可以使用查询操作获取:
需要使用Scan操作返回:
为了避免对经常使用的操作进行扫描操作,请创建本地二级索引(LSI)或全局二级索引(GSI)。
例:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
在此示例中,查询操作可以使您获得:
您将dynamodb表分区键/主键设置为customer_country
。如果使用查询,customer_country
则是进行查询操作的必填字段。所有过滤器只能设为所属的项customer_country
。
如果执行表扫描,则将对所有分区键/主键执行筛选。首先,它从表中获取所有数据并应用过滤器。
这customer_country
是分区键/主键
,id
是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
------------------------------------
如果执行查询操作,则仅适用于customer_country
值。该值应仅等于运算符(=)。
因此,仅提取与该分区键/主键值相等的项。
如果执行扫描操作,它将获取该表中的所有项目,并在获取数据后过滤掉数据。
注意:请勿执行超出RCU的扫描操作。
查询比“扫描”要好得多-明智地执行。顾名思义,scan将扫描整个表。但是您必须非常了解表键,排序键,索引和相关的排序索引,以便知道可以使用查询。如果使用以下方法过滤查询:
使用查询!否则,请使用scan,它可以更灵活地选择要过滤的列。
您不能查询是否:
很好的解释:https : //medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f