我正在使用Dynamo DB,并希望使用filter扫描一个表。例如,可以使用全局二级索引从表中扫描特定行吗?
答案 0 :(得分:4)
不可能!扫描总是针对基表中的所有行,当您将索引表作为响应进行扫描时,您将只获得该索引表中包含的属性。
实施例: 如果您有一个包含1000行和属性的表:id,name,surname,year,city,zipcode,并使用主键" city"为该表创建GSI。并且你包括" zipcode"作为一个投影属性,当您再次扫描该索引表时,将处理所有1000行,但作为响应,您将获得" city"和"邮政编码"对于每一行。增益会降低吞吐量,但是在创建GSI时您将设置的读写容量单位每月花费您。
答案 1 :(得分:3)
如果您正在扫描二分属性,即状态为空或无,则可以使用稀疏索引并提高效率!!
来自AWS文档' best practices for GSI'
利用稀疏索引
对于表中的任何项目,如果项目中存在索引键值,DynamoDB将仅将相应的条目写入全局二级索引。对于全局二级索引,这是索引分区键及其排序键(如果存在)。如果索引键值没有出现在每个表项中,则称该索引是稀疏的。
您可以使用稀疏全局二级索引来有效地查找具有不常见属性的表项。为此,您可以利用不包含全局二级索引属性的表项根本不编制索引的事实。例如,在GameScores表中,某些玩家可能已经为游戏赢得了特定的成就 - 例如" Champ" - 但大多数球员都没有。您可以创建一个全局二级索引,其分区键为Champ,排序键为UserId,而不是扫描整个GameScores表中的Champs。这样可以通过查询索引而不是扫描表来轻松找到所有冠军。
这样的查询可以非常有效,因为索引中的项目数量将远远少于表格中的项目数量。此外,您投射到索引中的表属性越少,您将从索引中消耗的读取容量单位就越少。