Jam*_*ore 31 amazon-web-services amazon-dynamodb aws-sdk
我需要将iOS应用程序上的本地数据与DynamoDB表中的数据保持同步.DynamoDB表是大约2K行,只有一个散列键(id),以及以下属性:
id (UUID)lastModifiedAt (时间戳)namelatitudelongitude我目前正在扫描和过滤lastModifiedAt,其中lastModifiedAt大于应用程序的上次刷新日期,但我认为这将变得昂贵.
我能找到的最佳答案是添加一个全局二级索引lastModifiedAt作为范围,但GSI没有明显的哈希键.
当需要使用GSI按范围查询时,最佳做法是什么,但没有明显的散列键?或者,如果完全扫描是唯一的选择,是否有任何最佳做法来降低成本?
bsd*_*bsd 28
虽然Global Secondary Index似乎符合您的要求,任何企图包括timestamp相关的信息作为你的一部分Hash Key很可能会创造什么被称为"热分区",这是非常不可取的.
随着最新项目的检索频率高于旧项目,将出现不均匀访问.这不仅会影响您的性能,还会降低您的解决方案的成本效益.
请参阅文档中的一些详细信息:
例如,如果一个表具有非常少量的大量访问的分区键值,甚至可能是一个非常频繁使用的分区键值,则请求流量集中在少量分区上 - 可能只有一个分区.如果工作负载严重不平衡,这意味着它不成比例地集中在一个或几个分区,该请求将不会实现整体配置的吞吐量水平.为了获得最大的DynamoDB吞吐量,创建表所在的分区键有大量不同的值,并请求的值相当均匀,如随机越好.
基于所陈述的内容,id似乎确实是你Hash Key(又名Partition Key)的一个很好的选择,我不会改变它,因为GSI键的工作方式与分区相同.作为一个单独的注释,当您通过提供整体来检索数据时,性能会得到高度优化Primary Key,因此我们应该尽可能地找到提供该解决方案的解决方案.
我建议创建单独的表来存储主键,具体取决于它们的更新时间.您可以根据最适合您的用例的粒度将数据分段到表中.例如,假设您希望按天分段更新:
一个.您的每日更新可以存储在具有以下命名约定的表中:updates_DDMM
湾 这些updates_DDMM表只有id's(另一个表的哈希键)
现在说最新的应用刷新日期是2天前(04/07/16),你需要获取最近的记录,然后你需要:
一世.扫描表updates_0504并updates_0604获取所有哈希键.
II.最后通过提交一个BatchGetItem包含所有获得的哈希键的主表(包含lat/lng,name等)来获取记录.
BatchGetItem 是超级快,并将像其他操作一样完成工作.
有人可能会说,创建额外的表会增加整体解决方案的成本......好吧,GSI你基本上是复制你的表(如果你是在预测所有字段)并为所有~2k记录增加额外成本,最近更新它们或不...
这似乎是反直觉创建这样的表,但它实际上是处理时间序列数据时的最佳实践(来自AWS DynamoDB文档):
[...]应用程序可能会在表格中的所有项目中显示不均匀的访问模式,其中最新的客户数据更相关,您的应用程序可能会更频繁地访问最新项目,并且随着时间的推移,这些项目的访问次数减少,最终物品很少被访问.如果这是一种已知的访问模式,则可以在设计表模式时将其考虑在内.您可以使用多个表来存储这些项,而不是将所有项存储在单个表中.例如,您可以创建表来存储月度或每周数据.对于存储数据访问率较高的最近一个月或一周的数据的表,请求更高的吞吐量,对于存储旧数据的表,您可以调低吞吐量并节省资源.
您可以通过将"热"项存储在具有较高吞吐量设置的一个表中,并将"冷"项存储在具有较低吞吐量设置的另一个表中来节省资源.您只需删除表即可删除旧项.您可以选择将这些表备份到其他存储选项,例如Amazon Simple Storage Service(Amazon S3).删除整个表比逐个删除项目效率要高得多,这实际上使写入吞吐量翻了一倍,就像执行put操作一样多的删除操作.
来源: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html
我希望有所帮助.问候.
Jam*_*ore 11
虽然D.Shawley的回答帮助我指出了正确的方向,但它错过了GSI的两个考虑因素:
因此,这是我采取的方法:
YearMonth(例如201508),范围为idlastModifiedAt > [given timestamp].您可以使用时间戳的"日"部分作为哈希值,并使用完整时间戳作为范围.
| 归档时间: |
|
| 查看次数: |
23386 次 |
| 最近记录: |