Performance 查询最新项目&;DynamoDB中分区键的正确使用

Performance 查询最新项目&;DynamoDB中分区键的正确使用,performance,amazon-web-services,database-design,amazon-dynamodb,alexa-skill,Performance,Amazon Web Services,Database Design,Amazon Dynamodb,Alexa Skill,我正在创建一个DynamoDB表,以支持作为播客播放器使用的Alexa技能。我设想这个表的方式是使用事件编号作为分区键,使用PublicationDate作为可选的排序键。对于以这种方式设计表模式,我有两个顾虑 首先,假设我想查询表以获取最新的插曲-我不确定我是否能够以这种方式进行查询,因为查询需要对分区键(插曲=X)进行等价操作,而我事先不知道这一点。如果播客有大量的剧集(比如说超过1000集),我认为扫描将是一个相当昂贵的操作,这是正确的吗 我需要查看表中的每个项目,将其事件编号(分区键值)

我正在创建一个DynamoDB表,以支持作为播客播放器使用的Alexa技能。我设想这个表的方式是使用事件编号作为分区键,使用PublicationDate作为可选的排序键。对于以这种方式设计表模式,我有两个顾虑

首先,假设我想查询表以获取最新的插曲-我不确定我是否能够以这种方式进行查询,因为查询需要对分区键(插曲=X)进行等价操作,而我事先不知道这一点。如果播客有大量的剧集(比如说超过1000集),我认为扫描将是一个相当昂贵的操作,这是正确的吗

我需要查看表中的每个项目,将其事件编号(分区键值)与以前返回的项目进行比较,并在每次找到一个项目时用最近的项目更新一个变量,直到表中的所有项目都以这种方式循环

其次,DynamoDB最佳实践说明了两件在我的用例中工作不协调的事情(可能是我的设计有缺陷的迹象)。首先,分区键应该是唯一的或接近唯一的。其次,查询应该或多或少均匀地分布在键之间。在我的例子中,虽然分区键确实是唯一的,但我希望绝大多数查询都是针对表中最新的分区键,用于包含最新播客插曲数据的项。例如,如果该技能在任何一天都有1000个查询,而这些查询都是针对单个分区键的,那么对性能会有什么影响

有谁能为这种类型的数据提供更好的表体系结构解决方案吗

提前感谢大家

问题1: 首先,假设我想查询表以获取最新的一集-我是 我不确定我是否能以这种方式完成,因为查询需要 分区键上的等价操作 我不会事先知道的。我认为扫描会 如果播客有大量的用户,这将是一个相当昂贵的操作 剧集(比如超过1000集)

您是对的,您将无法查询最新的一集,因为每一集都在各自的分区中。分区几乎类似于不同的独立表,因此不扫描就无法跨所有分区进行查询(如您所说)

问题2: 第二,DynamoDB最佳实践说明了两件事是可行的 与我的用例不一致(可能是我的设计 有缺陷)。首先,分区键应该是唯一的或接近唯一的。 其次,应该期望查询或多或少是一致的 分散在钥匙之间。在我的例子中,虽然分区 这把钥匙确实是独一无二的,我希望绝大多数人 查询的目标是表中最新的分区键 包含最新播客集数据的项。有什么问题 例如,如果技能获得1000个查询,则会对性能产生影响 在任何一天,所有的目标都是一个分区键

这里的问题有两个方面,AWS希望您对每个分区的读取(和写入)是相等的(或接近相等的),所以基本上要发生的是,您将为您不使用的分区上的写入单元(和读取单元)付费,即使您不使用它们

确切地说,要运行多少将取决于查询数据库的次数,然而,读取要比写入便宜得多,在一个包含1000个项目的表中,1000次读取基本上不算什么。你也许能侥幸逃脱,但这并不理想

备用表模式/键设计
  • 你还会提出什么其他问题?除“查看最近一集”外
  • 每天添加多少播客?星期?一年
  • 是否有多个“显示”或类别可用于分区键,这些分区键可能具有更均匀的分布,并且可能是“已知”的

  • 谢谢你的快速回复。回答您的问题:1)另一个查询是针对特定的剧集,它位于剧集编号(当前为分区键)上。2) 每天新增一集。3) 我不确定我可以用什么来代替分区键。只有一个节目,我可以使用它,但这意味着每集都有相同的分区键。对于我的用例来说,也许不会那么糟糕。如果请求的不是最新的一集,我可以按集号排序或按集号筛选。不过我觉得很有趣。你怎么认为?