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