我正在创建一个dynamodb表,其中主键是userId以确保唯一性。但是我需要根据时间戳选择返回行,我不会知道userID,并且会返回多个用户ID。例如(pseduo select)
select * from table where dateCreated was yesterday
因此,我将创建一个dateCreated的GSI。
dateCreated还应该是主键上的排序键还是它本身就是一个GSI呢?
其次,一旦我检索了这些项目,我很可能想要更新它们,但是如果我指定GSI应该返回所有属性,我是否真的需要将任何写入单元分配给GSI?好像我返回所有属性我应该有userID,所以理论上我可以使用userID然后进行写操作?
关于免费套餐,在理论上我可以用所有25个写入单元设置我的PrimaryKey,然后用所有25个免费读取单元设置我的GSI吗? (我认为它实际上可能会迫使你至少输入'1',但你明白了)
我的GSI是否还要定义排序键?
由于
答案 0 :(得分:2)
没有必要将dateCreated
设置为表格中的排序键,以使其成为DateCreatedGSI
上的哈希键。只有在您计划查询userId
上的表格并希望将所有结果按dateCreated
排序时,才将其设置为排序键。
关于读/写吞吐量的问题,您需要了解尽管"全局二级索引的预配置吞吐量设置与其基表"的配置吞吐量设置是分开的,但写入是连接的。 "对全局二级索引的查询操作使用索引而不是基表的读取容量单位。当您放置,更新或删除表中的项时,该表上的全局二级索引也会更新;这些索引更新消耗索引中的写入容量单位,而不是基表中的写入容量单位。"所以,是的,除了读取容量之外,您还需要为GSI分配写入容量。有关更多详细信息,请参阅文档:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.ThroughputConsiderations。根据此文档,如果您没有在GSI上设置足够的写入容量,则可以拒绝对表的整个更新:"为了使表写入成功,表的预配置吞吐量设置并且它的所有全局二级索引必须具有足够的写入容量来容纳写入;否则,对表的写入将受到限制。"
最后,与主表的情况一样,只有在关注结果返回给你时对结果进行排序的方式时,才应在GSI上定义排序键。
答案 1 :(得分:1)
dateCreated
不必是主表上的排序键
是的,应该为其定义ReadCapacityUnits和WriteCapacityUnits GSI也是如此。这是从main复制数据所必需的 表到GSI
我不确定你想要的写操作 使用userId执行。 DynamoDB将自动填充数据 从主表到GSI。你不能直接写任何东西 GSI。但是,您可以直接从GSI
不,GSI上不需要排序键