NoSQL:从表 DynamoDB/Azure 表存储中获取最新值

Posted

技术标签:

【中文标题】NoSQL:从表 DynamoDB/Azure 表存储中获取最新值【英文标题】:NoSQL: Getting the latest values from tables DynamoDB/Azure Table Storage 【发布时间】:2012-09-30 07:56:52 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

我今天刚刚发表了一篇文章,其中有一些 common "recipes" about DynamoDB。其中之一是“存储文章修订,始终保持最新”,我认为您可能会感兴趣 :)

简而言之,您可以使用Query(hash_key=..., ScanIndexForward=True, limit=1)获取最新项目

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

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

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

    hash_key:日期 range_key:时间或完整时间戳,随你喜欢

那么,你就可以使用Query + Limit=1 + ScanIndexForward=false的‘技巧’了

【讨论】:

感谢您的回答,您的文章读起来很有趣。我仍然有一个关于 ScanIndexForward 的问题。文档说:Specifies ascending or descending traversal of the index... ScanIndexForward 是否像 GROUP BY 一样工作,只是颠倒查询结果的顺序,还是实际上以相反的顺序读取 range_key,即这需要多少次读取?我担心的是,到一天结束时(假设 1 次写入/秒)有超过 86k 条目,并且在获取最新值时会不断地一遍又一遍地查看它们。 range_key 已编入索引,因此它很高效,而使用Query,您只需为检索到的结果付费。说了这么多,不知道内部是怎么实现的。 请注意:就我而言,我需要ScanIndexForward=False 而不是True。默认行为可能在文章撰写后的某个时候发生了变化。 query method 的文档如下:如果 ScanIndexForward 为 true ,DynamoDB 按范围键按顺序返回结果。这是默认行为。如果 ScanIndexForward 为 false,则 DynamoDB 按范围键对结果进行降序排序,然后将结果返回给客户端。 到目前为止,似乎 ScanIndexForward 已被 BackwardSearch 替换,具有相同的含义。不幸的是,我找不到任何有关此更改的文档。 您在此处的链接似乎已过期。我在blog.yadutaf.fr/2012/10/07/… 上发现了相同的内容【参考方案2】:

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

这是我的一篇博文,概述了如何使用 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 来获取最后一项。

【讨论】:

感谢您的回答。没有考虑过尝试这样解决它,尽管我对格式化时间戳有点犹豫,因为它是“数据的一部分”,因此它将被查询并且它应该是用户可以使用的格式理解。使用此解决方案,我必须重新处理每个时间戳以反转每个查询的转换。 我建议以正常表示形式存储另一个带有时间戳的列。【参考方案3】:

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

您可以从 UI 中的表中获取最新项目,方法是单击列以按这些值排序。

【讨论】:

这只对当前页面的结果(~100条记录)进行排序,大概是为了避免扫描整个表。

以上是关于NoSQL:从表 DynamoDB/Azure 表存储中获取最新值的主要内容,如果未能解决你的问题,请参考以下文章

mysql 联表查询主表一条数据从表多条数据查询显示重复从表条数数据问题

从表变量 MS SQL 中删除

关系类控件-明细表

数据库

SQL Server 从表变量更新

给springmvc接口快速增加字段检索,外键从表检索,外键从表查询的searchdb注解