Amazon dynamodb DynamoDB查询-GSI

Amazon dynamodb DynamoDB查询-GSI,amazon-dynamodb,Amazon Dynamodb,假设我有一张DynamoDB表: UserId: S BookName: S BorrowedTimestamp: S HasReturned: B UserId(分区)和BookName(范围)将是基表上的键 但是,我希望使用其他非关键字段进行查询,例如,BorrowedTimestamp>3days和HasReturned为false 我想我需要为这个查询设置一个GSI才能工作,但是用一个二进制字段作为分区键(借用的时间戳作为范围键)听起来不太正确。是这样,还是我遗漏了什么?不,您不需要G

假设我有一张DynamoDB表:

UserId: S
BookName: S
BorrowedTimestamp: S
HasReturned: B
UserId(分区)和BookName(范围)将是基表上的键

但是,我希望使用其他非关键字段进行查询,例如,BorrowedTimestamp>3days和HasReturned为false


我想我需要为这个查询设置一个GSI才能工作,但是用一个二进制字段作为分区键(借用的时间戳作为范围键)听起来不太正确。是这样,还是我遗漏了什么?

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

让我们以借用的时间戳>3天为例。我将假设这是针对某个特定用户的,因此您需要查询一个用户ID

您可以使用
userid
KeyConditionExpression
,然后使用
followeedtimestamp>3days的
filtereexpression
来执行一个操作。假设用户有10本书,其中2本有
借来的时间戳>3天。此查询将花费您10个RCU(读取容量单位)。这是因为
FilterExpression
只是过滤掉结果集中的项目-DynamoDB实际上在查询中找到了所有10个项目

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

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


最后,如果您根本不想指定一个用户ID,您可以使用。扫描有时不能很好地扩展,因为它们总是评估表中的每个项目,但它是否对您有效实际上取决于很多事情(例如您使用扫描的频率、表中的项目数量等)。

OP没有明确说明是否要在每个查询中指定
用户ID
,但如果他们这样做,那么LSI将取代GSI发挥作用