36

我有一个小问题需要一些建议:

  • 假设我们有几百个数据表,每个表有几千万行。
  • 数据表是时间戳(键) - 值
  • 数据表每秒写入一次

每个表的最新条目应该可以快速获得,并且很可能被查询最多(类似于“实时跟踪数据”)。由于缺少“Last()”或类似内容,我正在考虑创建另一个表“LatestValues”,其中更新每个数据表的最新条目以便更快地检索。但是,这将为每个写入操作添加额外的更新。此外,大部分流量将集中在这张桌子上(好/坏?)。有没有更好的解决方案或者我错过了什么?

另外,假设我们要查询数据表中的值。既然扫描显然是不可能的,那么唯一的选择是通过复制数据来创建二级索引,有效地使存储需求和写入操作量翻倍吗?还有其他解决方案吗?

我主要关注 DynamoDB 和 Azure 表存储,但我也很好奇 BigTable 是如何处理这个问题的。

4

3 回答 3

56

我今天刚刚发表了一篇文章,其中包含一些关于 DynamoDB 的常见“食谱”。其中之一是“存储文章修订,始终保持最新”,我认为您可能会感兴趣 :)

简而言之,您可以使用Query(hash_key=..., ScanIndexForward=True, limit=1)

但是,这假设您有一个 range_key_defined。

使用Scan,您没有这样的参数ScanIndexForward=false,无论如何,您不能依赖顺序,因为数据分布在分区上,Scan然后请求被负载平衡。

要使用 DynamoDB 实现您的目标,您可以通过以下方式“拆分”您的时间戳:

  1. hash_key: 日期
  2. range_key:时间或完整的时间戳,你喜欢

然后,您可以使用Query++的“Limit=1技巧 ”ScanIndexForward=false

于 2012-10-09T23:03:51.527 回答
-1

通常,您可能只想反转时间戳,因此它会随着时间的推移而减少,将最新的行留在顶部。

这是我的一篇博客文章,概述了如何使用 Windows Azure 存储:http: //blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure

更新

我将 DynamoDB 用于一个项目,但以一种非常简单的方式,所以我没有太多经验。也就是说,http: //docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html 向我建议您可以指定ScanIndexForward=falseLimit=1获取最后一项。

于 2012-10-09T22:47:59.133 回答
-3

对于发现此线程但只关心 1 个表的人:

您可以通过单击列以按这些值排序来从 UI 中的表中获取最新项目。

于 2020-06-12T01:04:56.447 回答