【问题标题】:DynamoDB: UpdatedDate as a Sort Key on a GSI?DynamoDB:UpdatedDate 作为 GSI 上的排序键?
【发布时间】:2021-06-17 15:55:21
【问题描述】:

正如this question 中所述,我假设您不能将更新日期之类的内容作为表的排序键,因为如果您更新,您将创建重复记录。

此外,我一直认为同样的事情适用于使用更新日期的 GSI。但在我的场景中,我将更新日期作为 GSI 上的排序键,并且在更新原始项目时不会创建新记录。

概括地说,属性和关键架构是:

属性:

  • 身份证
  • 我的排序键
  • MyComputedField
  • 更新日期

表:

  • PartitionKey:ID
  • 排序键:我的排序键

GSI:

  • PartitionKey:MyComputedField
  • 排序键:更新日期

我的问题是,我这样做是否间接影响了索引的性能?或者还有其他我不知道的由这种模式引起的问题吗?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    全局二级索引是独立的表,主表中的更改项会复制到它。

    正如您正确观察到的,您可以使用更改属性作为 GSI 中的排序键,而不会在写入基表后导致重复。 请注意,GSI 不能保证唯一性,即您可以拥有多个具有相同关键属性的项目。 除此之外,您只能从 GSI 进行最终一致的读取。

    GSI 也有自己的读取和写入容量单位,您需要配置它们,如果您更改基表中需要复制的项目,该操作将消耗 GSI 上的写入容量单位。 读取与此分开。 GSI 上的 RCU 不受对表的写入的影响。 但是如果您经常更改项目,您可能会在很短的时间内看到一些不一致(这就是为什么只有最终一致的读取是可能的)。

    这意味着如果你能忍受我提到的副作用,你就可以使用这些模式。

    【讨论】:

    • 知道了...我认为 :-)... 所以 GSI 在底层是单独的表,但它不会在索引中创建新记录,因为项目上的更改被复制到索引中的相同类似项目,是吗?
    • 它会创建一条新记录并删除旧记录,因此您的净值为零,但您可能会遇到一种情况,即您可能会根据更改获得旧的或不一致的数据。对于我期望的排序键属性的更改(基于我对底层存储架构的理解的有根据的猜测),您会遇到数据过时且不一致的风险。
    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多