亚马逊DynamoDB在分区中存储数据。分区是一个表的存储分配,由固态驱动器(SSD)支持,并在AWS区域内的多个可用区自动复制。分区管理完全由DynamoDB处理,你永远不需要自己管理分区。
当你创建一个表时,该表的初始状态是CREATING。在这个阶段,DynamoDB会给表分配足够的分区,以便它可以处理你的配置吞吐量要求。在表的状态变为ACTIVE后,你可以开始写和读表的数据。
在以下情况下,DynamoDB会向表分配额外的分区。
1.如果你增加表的配置吞吐量设置,超过现有分区所能支持的范围。
2.如果现有的分区填满了容量,需要更多的存储空间。
分区管理在后台自动发生,对你的应用程序是透明的。你的表在整个过程中保持可用,并完全支持你的配置的吞吐量要求。
DynamoDB中的全局二级索引也是由分区组成的。全局二级索引中的数据与它的基表中的数据分开存储,但索引分区的行为与表的分区基本相同。
数据分布:分区密钥
如果你的表有一个简单的主键(只有分区键),DynamoDB根据分区键的值来存储和检索每个项目。
为了把一个项目写到表中,DynamoDB使用分区键的值作为内部哈希函数的输入。哈希函数的输出值决定了项目将被存储在哪个分区。
要从表中读取一个项目,你必须为该项目指定分区键值。DynamoDB使用这个值作为其哈希函数的输入,产生可以找到该项目的分区。
下图显示了一个名为Pets的表,它跨越了多个分区。该表的主键是AnimalType(只显示了这个键属性)。DynamoDB使用它的哈希函数来决定在哪里存储一个新的项目,在这种情况下是基于字符串Dog的哈希值。请注意,这些项目不是按照排序的顺序存储的。每个项目的位置是由其分区键的哈希值决定的。
数据分布:分区键和排序键
如果表有一个复合主键(分区键和排序键),DynamoDB计算分区键的哈希值的方式与数据分布中描述的一样。分区键。然而,它将所有具有相同分区键值的项目在物理上紧密地存储在一起,按排序键值排序。
要把一个项目写到表中,DynamoDB计算分区键的哈希值,以确定哪个分区应该包含这个项目。在该分区中,几个项目可能具有相同的分区键值。所以DynamoDB将该项目存储在具有相同分区键的其他项目中,按排序键的升序排列。
要从表中读取一个项目,你必须指定其分区键值和排序键值。DynamoDB会计算分区键的哈希值,得出可以找到该项目的分区。
如果你想要的项目有相同的分区键值,你可以在一个操作(查询)中从表中读取多个项目。DynamoDB会返回所有具有该分区键值的项目。另外,你可以对排序键应用一个条件,这样它就只返回一定范围内的项目。
假设Pets表有一个由AnimalType(分区键)和Name(排序键)组成的复合主键。下图显示了DynamoDB写入一个分区键值为Dog、排序键值为Fido的项目。
为了从Pets表中读取相同的项目,DynamoDB计算Dog的哈希值,得出这些项目所存储的分区。然后DynamoDB扫描排序键属性值,直到找到Fido。
要读取所有动物类型为狗的项目,你可以发出查询操作,而不需要指定排序键条件。默认情况下,项目会按照它们被存储的顺序返回(也就是按照排序键的升序)。你可以选择要求以降序代替。
要想只查询某些狗项目,你可以对排序键应用一个条件(例如,只查询名字以A到K范围内的字母开头的狗项目)。