我在DynamoDB表的查询/扫描中想到了这种情况。
如果我想在一个表中获取单个数据并且该表中有20k数据,而我正在寻找的数据在第19k行怎么办?我使用限制为1000的扫描。即使第19次未返回任何项目,它也会消耗吞吐量吗?例如,
我有一个用户表:
type UserTable{
userId:ID!
username:String,
password:String
}
然后查询
var params = {
TableName: "UserTable",
FilterExpression: "username = :username",
ExpressionAttributeValues: {
":username": username
},
Limit: 1000
};
如何有效处理此问题?
答案 0 :(得分:0)
根据doc
扫描操作始终扫描整个表或二级索引。它 然后从本质上过滤出值以提供所需的结果 添加了从结果集中删除数据的额外步骤。
性能
如果可能,应避免在大桌子上使用``扫描''操作 或使用删除许多结果的过滤器建立索引。另外,作为桌子或 索引增长,扫描操作变慢
阅读单位
``扫描''操作检查每个项目的请求值,并可以 用完大表或索引中预配置的吞吐量 单次操作。为了缩短响应时间,请设计表格和 索引,以便您的应用程序可以使用查询而不是扫描
为了获得更好的性能,减少单位读取的消耗,我建议您将GSI与查询一起使用
答案 1 :(得分:0)
“扫描”操作将查看整个表并访问所有记录,以找出其中哪些记录符合您的过滤条件。因此,它将消耗足够的吞吐量来检索所有访问的记录。扫描操作也非常慢,特别是在表很大的情况下。
对于第二个问题,您可以在表上创建一个以用户名作为哈希键的二级索引。然后,您可以将扫描操作转换为查询。这样,它将仅消耗足以提取一条记录的吞吐量。