当前位置: 首页 > 知识库问答 >
问题:

使用唯一分区键与唯一分区排序键的DynamoDB查询性能

袁文景
2023-03-14

假设我有一个名为“student_course”的Dynamo DB表。我想存储每个学生在大学学习的课程。一个学生可以一次学习多个课程,一个课程可以一次有多个学生。所以基本上它是一个多映射。

我的数据访问模式只有一个用例-

  1. 一次获取一个学生和一门课程的记录,即获取每个学生ID和CourseId组合的数据。它保证对于学生ID和课程ID组合,只有一条记录可用。

为了实现这一点,我可以通过以下两种方式存储数据-

  1. 分区键={学生id},排序键={课程id}

我的问题是,如果有任何区别,那么哪个查询的性能会更好?我应该选择哪一个,为什么?

共有1个答案

龙焱
2023-03-14

就设计DDB性能而言,Get API是DDB毫秒数据检索能力的关键,因此围绕此API设计数据是合乎逻辑的

带有分区键排序键的表

Partition Key | Sort Key    
--------------+-------------
Course1       | Student1
Course1       | Student2

优势:

  1. 能够使用获取API通过分区键和排序键获取单个记录,例如,在分区键=“Course1”和排序键=“Student1”中获取单个记录
  2. 能够使用“获取API”仅通过分区键获取记录列表,例如,在分区键=“Course1”处获取所有记录

缺点:

  1. 如果您只知道排序键(即Student),而不知道分区键(即Course),则无法使用Get API(获取API)仅通过排序键检索记录

注意:一般来说,DDBGet API查询的效率(这样查询就不会轻易达到读取吞吐量(ReadThroughput)异常“屋顶”)与分区键的唯一性和分布性紧密相关。您拥有和分发的分区密钥越多,性能就越好

仅带分区键的表

Partition Key Only   
--------------------
Course1#Student1
Course1#Student2

优势:

  1. 能够使用获取API通过分区键获取单个记录,例如,在分区键=“Course1#Student1”处获取单个记录

缺点:

  1. 无法使用“获取API”仅使用分区键的子集来获取记录列表,例如,在分区键=“Course1”处获取记录列表

关于GSIs

注意:在表上添加全局二级索引是一种常见的情况,以支持使用备用键进行的Get API调用,例如获取记录列表,其中GSI Partition key=课程名称

Partition Key Only   | Non Key Attribute (Course) For GSI
---------------------+---------------------------
Course1#Student1     | Course1
Course1#Student2     | Course1

您最多可以有20个GSI索引(软限制),可以通过支持请求删除此限制

Partition Key Only   | Non Key Attribute (Course) For GSI | Lecturer (For GSI 2)
---------------------+------------------------------------+---------------------
Course1#Student1     | Course1                            | Lecturer1
Course1#Student2     | Course1                            | Lecturer1

结论

如果性能是关键的,我会设计一个表,使分区键具有尽可能多的唯一值,即分区键=Course1#Student1 VS分区键=Course1,排序键=Student1

如果需要通过备用键进行查询,请按需向表中添加GSIs

(历史上GSI限制为每个Table 5,并且必须在Table创建期间指定,但这些限制已被取消)

 类似资料:
  • 说在AWS DynamoDB,我有一个表: 我的GSI会投影原始表的所有属性。 现在我想最终得到一组数据结构{“Alice”,“Bob”,“John”,“Michael”}。 我怎样才能做到这一点?似乎扫描操作本身不能选择唯一值,这意味着在我的情况下,扫描操作不能更快,对吗?然后,在我得到一个检索到的所有项目的列表之后,我需要对这个列表进行操作,以提取列的唯一值,这是唯一的方法吗? 所以我想我需要

  • 我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。 这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措

  • 我有一个带有分区键(UUID)的DynamoDB表,其中有几个属性(如名称、电子邮件、创建日期等)。创建日期是项目中的一个属性,其格式为YYYY-MM-DD。但现在有一个要求更改-我必须根据创建日期对其进行排序,并提供整个数据(也就是说,我不能只将数据放在某个特定分区上,而是以排序方式将所有分区中的所有数据都放在一起。我知道这可能需要DynamoDB花费时间从所有分区中提取数据并在之后进行排序。我

  • 我正在DynamoDB中设计一个表,它将包含大量记录,每个记录都有一个唯一的ID和一个时间戳。我需要检索一组位于两个日期之间的记录,而不管所有其他属性值如何。 为时间戳字段添加全局辅助索引似乎是一个合乎逻辑的解决方案,但这并不简单。 DynamoDB中的Query命令需要一个KeyConditionExpression参数,该参数确定查询返回的结果。从DynamoDB开发人员指南: 要指定搜索条件

  • 我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分

  • 我是DynamoDB的新手,想知道我们如何通过在JAVA中使用ONLY分区键来查询DynamoDB中的表 我有一个名为“ervive pdi data invalid qa”的表,其模式是: 分区键为SubmissionId 排序键是id。 城市(属性) 错误(属性) 这张桌子看起来像这样:桌子 我想通过使用(software.amazon.awssdk)新版本的AWS SDK DynamoDB类