虽然Global Secondary Index
似乎符合您的要求,任何企图包括timestamp
相关的信息作为你的Hash Key
的部分将很可能创造了被称为“热分区”,这是非常不可取的。
不均匀的访问将发生,因为最近的项目将以比旧的更频繁的方式来检索。这不仅会影响您的表现,还会使您的解决方案降低成本效益。
见一些细节从文档:
例如,如果表中有非常少量的大量访问 分区键值,甚至可能是单个非常频繁使用的 分区键值的,请求交通专注于分区的小数字 - 可能只有一个分区。如果工作负载为 严重不平衡,这意味着它不成比例地集中在一个或几个分区上,请求将无法达到预配置吞吐量级别的总体 。要充分利用DynamoDB 吞吐量,请创建表,其中分区键具有不同值的大数 ,并且请求的值相当均匀,因为 尽可能随机。
基于什么说明,id
看来确实是你的Hash Key
(亦称Partition Key
)一个不错的选择,我不会改变,作为GSI键相同的方式工作,至于分区。作为一个单独的说明,当您通过提供整个Primary Key
来检索数据时,性能会得到高度优化,所以我们应该尽力找到一个尽可能提供该解决方案的解决方案。
我建议创建单独的表来存储基于最近更新的主键。您可以根据最适合您的用例的粒度将数据分割成表格。例如,假设您想要按天分段更新:
a。您的每日更新可以使用以下命名约定存储在表格中:updates_DDMM
b。 updates_DDMM
表将只有id
的(另一个表的哈希键)
现在说最新的应用程序刷新日期是从2天前(04/07/16),你需要得到最近的记录,那么你需要:
i。扫描表updates_0504
和updates_0604
以获取所有散列键。
ii。最后通过提交BatchGetItem
所有获得的散列键,从主表中获取记录(包含纬度/经度,名称等)。
BatchGetItem
速度超快,并会像没有其他操作一样完成工作。
人们可以争辩说,创建额外的表会增加成本,你的整体解决方案......嗯,跟你GSI
基本上是复制你的表(如果你正在投影的所有字段),并补充说,额外费用为所有〜2K记录,被他们最近更新的或不...
似乎直觉创建表这样的,但它实际上是时间序列数据处理(从AWS DynamoDB文档)时,最好的做法:
[。 ..该应用程序可能会显示横跨在客户的最新数据更相关和您的 应用程序可以访问最新的项目更频繁,随着时间的 通过这些项目较少访问,最终上了年纪的项目表中的所有项目 不均匀访问模式很少访问 。如果这是一种已知的访问模式,那么在设计表模式时可以考虑到它 。取而代之的 存储在一个表中的所有项目,您可以使用多个表 存储这些项目。例如,您可以创建表来存储每月或每周数据 。对于表存储从最新 按月或按周,其中的数据访问率高的数据,要求更高 吞吐量和表中存储旧数据,你可以拨下来的 吞吐量和节省资源。
您可以通过将“热”项存储在一个表中,节省资源,其中 的吞吐量设置较高,另一个表中的“冷”项的吞吐量设置较低。您可以通过简单地删除 表删除旧的项目。您可以选择将这些表备份到其他存储 选项,如Amazon Simple Storage Service(Amazon S3)。删除 整个表是显著更有效的不是删除项目 一个接一个,正如你做 尽可能多的删除操作是把操作写入吞吐量基本翻倍。
来源: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html
我希望帮助。问候。
来源
2016-04-08 04:19:55
bsd
请参阅我的回答以了解其他注意事项。问候。 – bsd
我有和你一样的情况,来到同一个解决方案。感谢您在此发布此信息。一注:GSI不需要是唯一的:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForGSI.html – ustroetz