【问题标题】:How can I query dynamodb table sorted by `timestamp`?如何查询按“时间戳”排序的 dynamodb 表?
【发布时间】:2023-03-30 20:38:01
【问题描述】:

我有一个 dynamodb 表,其分区键为 ID,排序键为 timestamp。我需要根据timestamp 列查询表以查找最新的 100 行。当我检查query API 时,我必须指定KeyConditions or KeyConditionExpression。在这种情况下,我不想查询分区键。我怎样才能做到这一点?

scan 操作似乎不支持对结果进行排序。

我能想到的一个解决方案是在表上添加一个属性,比如说status,并为该表中的每一行分配相同的值。然后在表上创建一个 GSI,分区键为statustimestamp 为排序键。然后我可以查询分区键等于OK 的表,并根据timestamp 对结果进行排序。但是,该解决方案在规模方面效果不佳。 GSI 将无法很好地缩放,因为表中的每一行都具有相同的 status 值。

那么,我的问题的最佳解决方案是什么?我不应该考虑使用 dynamodb 吗?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    您的方法是有效的。而且,如果您将 GSI 分区键中的虚拟值保持小(即一个字节),则不会对性能产生太大影响。关于具有相同分区键的所有项目的缩放问题,如果集合大小增长到大于 10 GB,DynamoDB splits partitions by sort key

    请查看与您类似的this StackOverflow question

    【讨论】:

      【解决方案2】:

      已排序的元素在分区内进行排序。您需要将所有结果放在同一个分区上。

      但显然您不想要一个分区,而是回到 SQL 数据库。在 DynamoDB 中这样做的不舒服和不安的方式是使用 Streams。当您有新元素或更新时,您可以检查这些元素是否位于顶部 N 位置。如果他们然后替换该值,例如,假设您有钱人:

      PK            Attributes:  
      #Entity#21    name=Fred.      money=5,000     
      #Entity#22    name=Bob.       money=10,000     
      #Entity#23    name=Smith.     money=1,000     
      ...
      

      然后我们可以跟踪前 10 名最富有的人:

      PK              SORT               Attributes:      
      #Money#Highest    1               id=#Entity#22    value=10,000
      #Money#Highest    2               id=#Entity#102   value=9,000
      ...
      

      然后,当您想要最富有的人时,您可以使用PK=#Money#Highest 进行查询。根据您的查询,您还可以复制更多属性。如果您想跨分区计算顶部something,这几乎是可行的,您可以设置流并自己做。请注意,尽管根据您的流设置,这些总数会过时几秒钟。您流式传输 Lambda 将类似于:

      const handler = (event, context, callback) => {
          event.Records.forEach((ev, i) => {
              if (ev.eventName === "INSERT" || ev.eventName === "UPDATE" || ) {
                // TODO
              }
            }
          }
      

      我知道这很烦人!但这是实现这些东西的奇怪方式。但它非常快,因为您只检索预先计算的值。这就是您使用 Dynamo 的全部方式,存储便宜,计算昂贵,优化计算,并根据需要复制数据,因为无论如何它很便宜。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多