我有一个包含不同人发布的博客的表;主键是作者+时间; 如何查询按时间排序的最近4个博客?(获取blog6,blog3,blog5,blog4)
如果我创建一个全局二级索引(即:我创建一个新的属性调用状态,将所有值设置为" ok"),将status + time设置为主键
我知道我可以解决我的问题。但结果是:索引中的所有数据都只存储在一个分区中
会导致任何弱点吗?
答案 0 :(得分:1)
添加稀疏索引(例如,status)类似于创建仅包含最近博客帖子的另一个表。确保您使用的是大多数博客帖子都具有的稀疏功能(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForGSI.html#GuidelinesForGSI.SparseIndexes)' null'作为此列的值。这样你的索引就会变小,这些查找应该是有效的。
维持此索引的小尺寸的一种方法是设置"较旧的"将状态记录到' null',或者每天(使用计划的Lambda函数)或每次对表的新插入(再次使用正在侦听表的更新流的Lambda函数)。
建议使用缓存进行这些频繁的查找(网站的每个视图都需要它),这是一个很好的选择。如果您的命中率很高,则应该像任何其他重复查询一样缓存它。
答案 1 :(得分:0)
如何查询按时间排序的最近4个博客?
可以使用ScanIndexForward
的{{1}}来完成此操作。来自DynamoDB documentation:
您可以使用ScanIndexForward参数按排序键以正向或反向顺序获取结果。
对于Java API,请参阅DynamoDBQueryExpression#setScanIndexForward
索引中的所有数据将仅存储在一个部分中。会不会有任何弱点?
是。建议不要将所有数据都放在一个分区中。见guidelines for partitioning
答案 2 :(得分:0)
看起来你走在正确的轨道上。你对查询绝对正确。它们只为您提供给定分区键的记录。
如果您需要按时间排序的数据,无论分区密钥如何,那么您将需要使用全局二级索引。
您在Status
上创建GSI的想法是向正确方向迈出的一步,但不幸的是,正如您所怀疑的那样,它会对您的索引产生压力,因为它会强制索引中的所有记录都在同一个划分。这几乎打败了DynamoDB的可扩展性。
但并非一切都没有丢失。您可以创建一个属性,该属性是记录时间戳的粗略表示。一个例子可能是使用月份或一年中的某一天。这将允许将记录放在前12个分区中,或者为后者放置365个分区。折衷方案是你需要一些查询才能找到最新的条目而不是单个查询,不过在性能方面它会更好。
根据您的需要,另一种可能性是创建外部指数。也许你可以让你的系统保留最近创建的博客帖子的缓存。随着新帖子的创建,它们会被添加到缓存中。随着旧帖子变得“旧”,他们会从缓存中逐出。您必须解决持久性问题,但如果需要,还可以通过扫描表来重建缓存。
或者您可以使用另一个Dynamo表(或关系数据库)来存储最新的博客帖子。只要这组最近的帖子相对较小,你应该没问题。