2015-10-14 53 views
1

我无法理解全局二级索引和表格之间的区别。GSI和表格之间的差异

  • 为什么我会使用全局二级索引,为什么不只是创建另一个表?
  • 我必须指定两者的读写吞吐量。当使用GSI写表时发生写操作时,我必须写入表和索引。那么我的问题是为什么GSI不创建另一个表而不是全局二级索引?
  • 使用GSI会带来什么好处?

回答

0

让我们分解你的问题。

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)与全表扫描(无索引情况下无法避免)相比,它的速度更快,成本更低。

希望它能帮助:)

0

当一个写上了GSI我必须写表和索引都表出现。那么我的问题是为什么GSI不创建另一个表而不是全局二级索引?

不,您不需要同时写入表格和GSI。 DynamoDB会自动为您维护索引。即当您写入表格时,GSI将自动更新。

通过使用GSI我可以获得什么好处?

您将能够通过GSI密钥“查询”数据。

用大量的实例非常详细的解释是正确的有http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

1

我会在这坐刺。

有一件事是你得到了一个最终一致的数据视图,它也可以作为一种“事务性”模型。

想象一下,您想要跟踪用户/组关系。这可能不是最好的例子,但我认为它会证明几点。

假设您的用例是您希望能够为所有用户组的Query所有用户组和Query组。在这个简单的设置,你会觉得有2个表:

  1. UsersToGroups与哈希+范围的userId + groupId
  2. GroupsToUsers与哈希+的groupId + userId范围。

如果你需要做一个更新客户端需要任何关系:

  1. 刻录到UsersToGroups表(哈希:userId,范围:groupId
  2. 刻录到GroupsToUsers表( hash:groupId,范围:userId

如果第二次写入失败会发生什么?如果第二次写入失败,如何回滚第一次写入?你怎么知道你的第二次写入失败,说如果连接失败发生?

这些问题并不好玩。

使用GSI,您可以拥有一张表,具体取决于您想如何管理它。如果不使用2个表格,假设我使用单个表格和单个GSI。

  1. UsersToGroups与散列+的userId +`范围GROUPID
  2. GroupsToUsers GSI与散列+的groupId + userId范围。

如果您需要做任何关系的更新客户端需要:

  1. 刻录到UsersToGroups

这就是它。 您只需提出1个请求。如果写入成功,您可以保证您的索引将(最终)具有相同的数据。根据您查询此索引的频率或需要传播多少数据,您可以相应地调整吞吐量。

这个简单的例子假设userId S和groupId是独一无二的,没有冲突将会发生时,他们预计该指数,但我认为这很好地解释至少有一些用处

欲了解更多信息的一个很好的工作,请参阅Guidelines for Global Secondary Indexes documentation