Dynamo DB查询和扫描行为问题

时间:2018-09-07 06:41:35

标签: amazon-web-services amazon-dynamodb aws-appsync

我在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
        };

如何有效处理此问题?

2 个答案:

答案 0 :(得分:0)

根据doc

  

扫描操作始终扫描整个表或二级索引。它   然后从本质上过滤出值以提供所需的结果   添加了从结果集中删除数据的额外步骤。

性能

  

如果可能,应避免在大桌子上使用``扫描''操作   或使用删除许多结果的过滤器建立索引。另外,作为桌子或   索引增长,扫描操作变慢

阅读单位

  

``扫描''操作检查每个项目的请求值,并可以   用完大表或索引中预配置的吞吐量   单次操作。为了缩短响应时间,请设计表格和   索引,以便您的应用程序可以使用查询而不是扫描

为了获得更好的性能,减少单位读取的消耗,我建议您将GSI与查询一起使用

答案 1 :(得分:0)

“扫描”操作将查看整个表并访问所有记录,以找出其中哪些记录符合您的过滤条件。因此,它将消耗足够的吞吐量来检索所有访问的记录。扫描操作也非常慢,特别是在表很大的情况下。

对于第二个问题,您可以在表上创建一个以用户名作为哈希键的二级索引。然后,您可以将扫描操作转换为查询。这样,它将仅消耗足以提取一条记录的吞吐量。

Read about Secondary Indices Here