我无法理解全局二级索引和表格之间的区别。GSI和表格之间的差异
- 为什么我会使用全局二级索引,为什么不只是创建另一个表?
- 我必须指定两者的读写吞吐量。当使用GSI写表时发生写操作时,我必须写入表和索引。那么我的问题是为什么GSI不创建另一个表而不是全局二级索引?
- 使用GSI会带来什么好处?
我无法理解全局二级索引和表格之间的区别。GSI和表格之间的差异
让我们分解你的问题。
1.全局二级索引和表之间有什么区别。
表:在dynamo中,db表只是数据的存储工具,与rdbms不同,它不需要维护任何类型的约束以及与另一个表的关系。
GSI:它是由dynamo db提供的一个功能,它有助于以更快的方式从表中检索数据。
2.为什么我会使用全局二级索引,为什么不只是创建另一个表。
由于dynamo db是一个NoSQL数据库,我们无法像使用oracle这样的传统RDBMS来做查询。为了达到查询的目的,我们需要在基于我们想查询的表的那些属性上具有索引。如果我们不把GSI或LSI的索引作为索引,我们想要提取一些信息,我们将不得不扫描整个表格。
如果我们创建另一个表,那么我们还需要在某个时间点查询该表。
3.当用gsi写一个表时,我必须同时写入表和索引。
虽然我不确定,但我们可以放心地假定数据不会单独写入表格和原始格式的索引。他们必须在他们的数据库中进行某种优化。所以与简单的db写入相比,所涉及的成本并不完全相似。
也我们,开发人员,不需要写入GSI和表中写入它是由dynamo数据库本身管理,我们只需要在表中写。
4.通过使用gsi可以获得什么好处?
a)与LSI不同,GSI保持索引松散耦合表。我们可以在需要时单独创建/删除它们。所以它比LSI更好
b)由于它提供了散列和范围组合,因此查询可以以更优化的方式完成。
c)与全表扫描(无索引情况下无法避免)相比,它的速度更快,成本更低。
希望它能帮助:)
当一个写上了GSI我必须写表和索引都表出现。那么我的问题是为什么GSI不创建另一个表而不是全局二级索引?
不,您不需要同时写入表格和GSI。 DynamoDB会自动为您维护索引。即当您写入表格时,GSI将自动更新。
通过使用GSI我可以获得什么好处?
您将能够通过GSI密钥“查询”数据。
用大量的实例非常详细的解释是正确的有http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
我会在这坐刺。
有一件事是你得到了一个最终一致的数据视图,它也可以作为一种“事务性”模型。
想象一下,您想要跟踪用户/组关系。这可能不是最好的例子,但我认为它会证明几点。
假设您的用例是您希望能够为所有用户组的Query
所有用户组和Query
组。在这个简单的设置,你会觉得有2个表:
UsersToGroups
与哈希+范围的userId
+ groupId
GroupsToUsers
与哈希+的groupId
+ userId
范围。如果你需要做一个更新客户端需要任何关系:
UsersToGroups
表(哈希:userId
,范围:groupId
)GroupsToUsers
表( hash:groupId
,范围:userId
)如果第二次写入失败会发生什么?如果第二次写入失败,如何回滚第一次写入?你怎么知道你的第二次写入失败,说如果连接失败发生?
这些问题并不好玩。
使用GSI,您可以拥有一张表,具体取决于您想如何管理它。如果不使用2个表格,假设我使用单个表格和单个GSI。
UsersToGroups
与散列+的userId
+`范围GROUPIDGroupsToUsers
GSI与散列+的groupId
+ userId
范围。如果您需要做任何关系的更新客户端需要:
UsersToGroups
这就是它。 您只需提出1个请求。如果写入成功,您可以保证您的索引将(最终)具有相同的数据。根据您查询此索引的频率或需要传播多少数据,您可以相应地调整吞吐量。
这个简单的例子假设userId
S和groupId
是独一无二的,没有冲突将会发生时,他们预计该指数,但我认为这很好地解释至少有一些用处
欲了解更多信息的一个很好的工作,请参阅Guidelines for Global Secondary Indexes documentation。