1

我有一个看起来像这样的 DynamoDB 表:

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

[id]是表的简单主键

[__typename]是对表中所有项目具有相同值的属性

桌子变得很大。我希望能够按范围 datetime过滤数据。我有 2 个可快速实施的选项,但我不确定这是否会在成本方面产生很大影响。

  1. 扫描整个表,然后按日期时间过滤(因为 dynamodb 不允许在扫描前过滤)
  2. 通过固定的 __typename 分区创建 GSI(partitionKey: __typename, sortKey: datetime)和 QUERY,并按日期时间排序键过滤,例如 10/8/10 和 10/11/10 之间。

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

4

1 回答 1

0

过滤器总是所有读取操作之后发生。在这种情况下,Scan 和 Query 没有区别。此外,如果您为所有元素创建具有相同 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.

于 2020-09-09T14:39:57.717 回答