GSI和表之间的差异

时间:2015-10-14 03:12:45

标签: amazon-web-services amazon-dynamodb

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

  • 为什么我要使用全局二级索引,为什么不创建另一个表呢?
  • 我必须为两者指定读写吞吐量。当在具有GSI的表上发生写入时,我必须同时写入表和索引。那么我的问题是为什么GSI不创建另一个表而不是全局二级索引?
  • 使用GSI可以获得哪些好处?

3 个答案:

答案 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群组的所有用户。在这个简单的设置中,您会想到有两个表:

  1. UsersToGroups的哈希值+范围为userId + groupId
  2. GroupsToUsers,散列+范围为groupId + userId
  3. 如果您需要更新客户需要的任何关系:

    1. 写入UsersToGroups表格(哈希:userId,范围:groupId
    2. 写入GroupsToUsers表格(哈希:groupId,范围:userId
    3. 如果您的第二次写入失败会怎样?如果第二次写入失败,如何回滚第一次写入?你怎么知道你的第二次写入失败,说连接失败是否发生?

      这些问题处理起来并不好玩。

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

      1. UsersToGroups,其哈希值+范围为userId +`groupId
      2. GSI GroupsToUsers,散列+范围为groupId + userId
      3. 如果您需要更新客户需要的任何关系:

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

          这个简单的例子假设userIdgroupId是唯一的,当它们被投射到索引时不会发生冲突,但我认为它在解释至少一些有用性方面做得很好< / 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