【问题标题】:DynamoDB Query - GSIDynamoDB 查询 - GSI
【发布时间】:2018-04-26 20:22:09
【问题描述】:

假设我有一个 DynamoDB 表:

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

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

但是我想使用其他非关键字段进行查询,例如BorrowedTimestamp > 3days 并且 HasReturned 为 false。

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

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

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

    让我们以 BorrowedTimestamp > 3days 为例。我假设这是针对特定用户的,所以你有一个用户 ID 可以查询。

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

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

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

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

    【讨论】:

    • OP 没有明确说明他们是否要在每个查询中指定 userid,但如果他们这样做了,那么 LSI 将代替 GSI 工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多