当前位置: 首页 > 知识库问答 >
问题:

DynamoDB用于筛选的扫描与查询(使用GSI,整个表的分区键相同)的成本

郎正平
2023-03-14

我有一个DynamoDB表,如下所示:

[id] [datetime] [name] [reasonForVisit] [__typename]

[id]是表的简单主键

[\uu typename]是一个属性,它对表中的所有项目都具有相同的值

桌子变得很大了。我希望能够根据日期时间按范围过滤数据。我脑海中有两个快速实施的选项,但我不确定这是否会在成本方面产生很大的影响。

  1. 扫描整个表,然后按日期时间过滤(因为dynamodb不允许在扫描之前过滤)

所以,我的问题是,由于我的分区键对每个项目都是相同的,因此是一个大分区,我不确定当使用过滤器查询时,它是否仍然会导致读取整个表(类似于SCAN)还是它知道有效地开始读取基于过滤器的项目?

共有1个答案

呼延鹏云
2023-03-14

过滤总是在所有读取操作之后发生。在这种情况下,扫描和查询没有区别。此外,如果您为所有元素创建具有相同PK的GSI,您可能会遇到“热分区”问题,此外您还会减慢写入速度。

如果您在表中查找80%的记录,扫描过滤器解决方案可能非常适合。否则,您需要利用Dynamo提供的查询功能(因此通过PK和SK进行查询)。你可以做的是介绍第二张唱片,比如:

id(PK), datetime, name, reasonForVisit, __typename
date(PK), time(SK), id

或:

id(PK), datetime, name, reasonForVisit, __typename
date(PK), time(SK), id_list

或者,如果您的数据是不可变的(历史数据),并且永远不会更改,那么:

id(PK), datetime, name, reasonForVisit, __typename
date(PK), time(SK), id, name, reasonForVisit, __typename

对给定范围的查询将使用BatchGetItem完成。在第一个和第二个选项中,当使用BatchWriteItem(或TransactWriteItem(如果严格一致性很重要)添加新记录时,您需要进行两次写入。对于第三个选项,您可以改为在id上使用GSI。

 类似资料:
  • 我有一个用例,我必须在Dynamo DB中返回表的所有元素。 假设我的表有一个分区键(列X),所有行中的值都相同,比如“monitor”和排序键(列Y),元素不同。 以下方法的执行时间是否会有任何差异,还是相同? 扫描整张桌子。 基于具有“监视器”的分区键查询数据。

  • 我已经在该表上创建了DynamoDB表和全局辅助索引。我需要从该表的GSI中获取所有数据。 有两种选择: 无筛选表达式的扫描操作 我需要找出哪一个性能更好,以便我开始我的实现。 我已经读了很多关于DynamoDB扫描和查询操作,但可以解决我的查询。 请帮我解决我的问题。 提前谢谢。 阿披实

  • 在我的DynamoDB表中,有HashKey=ID和GSI=Type。我需要获取特定类型(GSI)的所有hashKeys(ID)。 在这种情况下,获取给定类型的所有ID的有效方法是什么?我的DynamoDB表不会很大。

  • 我有一个带有哈希键(id)的表(配置文件),我有一个关于名称的GSI,一个关于国家的范围键。我想创建一个DAO方法,它将获取所有具有给定值的name和country的记录,如下所示:List getProfileWithNameAndCountry(name,country);

  • DynamoDb文档中指定的查询操作: 查询操作仅搜索主键属性值,并支持对键属性值的比较运算符子集以优化搜索过程。 和扫描操作: 扫描操作扫描整个表。您可以指定要应用于结果的过滤器,以在完成扫描后优化返回给您的值。 这是基于性能和成本考虑的最佳选择。

  • 对于何时选择GSI或其他方式的全表扫描,是否有任何衡量标准? 我知道两者背后的基本概念,但GSI的定价模型非常依赖于表格本身,我很难决定 更重要的是,如何在不同的表大小下进行扩展,或者多少扫描效率太低,而需要GSI 顺便说一下,我很难找到好的资源来过滤表达式,以便在dynamodb上进行查询和扫描,有什么好的建议吗?(“#v