DynamoDB查询 - GSI

时间:2018-04-25 00:27:14

标签: amazon-dynamodb

说我是否有DynamoDB表:

UserId: S
BookName: S
BorrowedTimestamp: S
HasReturned: B

UserId(分区)和BookName(范围)将是基表上的键。

但是我想使用其他非关键字段进行查询,例如BorrowedTimestamp> 3天和HasReturned是假的。

我认为我需要设置一个GSI才能使这个查询正常工作,但是将二进制字段HasReturned作为分区键(使用BorrowedTimestamp作为范围键)听起来并不合适。这是正确的,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

不,您不需要GSI,但根据您的具体情况,它可能更有效。

让我们举例说明BorrowedTimestamp> 3天。我将假设这是针对特定用户的,因此您有一个用户ID来查询。

您可以使用KeyConditionExpression userid,然后FilterExpression BorrowedTimestamp > 3daysquery。假设用户有10本书,其中2本有BorrowedTimestamp > 3days。此查询将花费您10 RCU(读取容量单位)。那是因为FilterExpression只过滤掉结果集中的项目 - DynamoDB实际上找到了查询中的所有10个项目。

现在假设您有一个GSI,其中分区键为userid,范围键为BorrowedTimestamp。您的KeyConditionExpression可以指定userid的分区键和BorrowedTimestamp > 3days的范围键。结果将完全相同。但是这次它只需要2个RCU,那些RCU将来自索引容量而不是表容量。

较少的RCU听起来不错,但请记住,您必须分别购买主索引和GSI的吞吐量容量。这可能效率较低,因为您无法在使用主键和GSI的查询之间共享购买的吞吐量。

最后,如果您根本不想指定用户ID,则可以使用scan。扫描有时不能很好地扩展,因为它们总是评估表中的每个项目,但它是否适用于你真的取决于很多事情(比如你将使用扫描的频率,你将在表中有多少项目等) )。