Indexing DynamoDB中局部索引和全局索引之间的差异

Indexing DynamoDB中局部索引和全局索引之间的差异,indexing,amazon-dynamodb,secondary-indexes,Indexing,Amazon Dynamodb,Secondary Indexes,我对这两个二级索引以及它们之间的差异感到好奇。很难想象这是什么样子。我认为,这将帮助更多的人而不仅仅是我。本地二级索引仍然依赖于原始散列键。 当您提供具有hash+range的表时,请将LSI视为hash+range1、hash+range2。。哈希+范围6。 您还可以查询5个范围属性。 此外,只有一个配置的吞吐量 全局二级索引定义了一个新的范例-每个索引具有不同的哈希/范围键。 这打破了原来每个表使用一个哈希键的习惯。 这也是为什么在定义GSI时,需要为每个索引添加一个已配置的吞吐量并为此付费

我对这两个二级索引以及它们之间的差异感到好奇。很难想象这是什么样子。我认为,这将帮助更多的人而不仅仅是我。

本地二级索引仍然依赖于原始散列键。 当您提供具有hash+range的表时,请将LSI视为hash+range1、hash+range2。。哈希+范围6。 您还可以查询5个范围属性。 此外,只有一个配置的吞吐量

全局二级索引定义了一个新的范例-每个索引具有不同的哈希/范围键。
这打破了原来每个表使用一个哈希键的习惯。 这也是为什么在定义GSI时,需要为每个索引添加一个已配置的吞吐量并为此付费


有关差异的更多详细信息,请参见另一种解释方式:LSI帮助您对具有相同哈希键的项执行其他查询。GSI帮助您对“整个表”中的项目执行类似的查询。非常有用

如果您有用户配置文件表:
唯一的id、名称、电子邮件。如果您需要在名称、电子邮件上对表进行查询,那么唯一的方法就是让它们成为GSI(LSI不会有帮助)

以下是可能的索引搜索:

  • 散列
  • 按哈希+范围
  • 通过哈希+本地索引
  • 按全球指数
  • 按全局索引+范围索引
表的哈希和范围索引: 这些是Amazon AWS SDK早期版本的常用索引

全局和局部索引: 这些是在表上创建的“附加”索引,以及表的现有哈希和范围索引。 全局索引类似于散列范围索引的行为类似于与表哈希一起使用的范围索引。 在代码的实体模型中,getter必须以以下方式进行注释:

  • 对于全局索引:

    @DynamoDBIndexHashKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_USER)
    public String getUser() {
        return user;
    }
    
  • 对于与全局索引关联的范围索引:

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_TIMESTAMP)
    public String getTimestamp() {
        return timestamp;
    }
    
此外,如果通过全局索引读取表,则它必须是最终读取(不一致读取):


以下是文档中的正式定义:

全局二级索引-具有哈希和范围键的索引,可以 与桌上的不同。一个全局二级索引是 被认为是“全局的”,因为对索引的查询可以跨越所有 表中的数据,跨所有分区

本地二级索引-与本地二级索引具有相同哈希键的索引 表,但范围键不同。本地二级索引为“本地” 在这个意义上,本地二级索引的每个分区都是有范围的 指向具有相同哈希键的表分区

然而,这些差异远远超出了关键定义的可能性。以下是一些直接影响指数维护成本和工作量的重要因素:

  • 吞吐量:
本地二级索引消耗表中的吞吐量。通过本地索引查询记录时,该操作将消耗表中的读取容量单位。在具有本地索引的表中执行写入操作(创建、更新、删除)时,将有两个写入操作,一个用于表,另一个用于索引。这两个操作都将消耗表中的写入容量单位

全局次索引有其自己的配置吞吐量,当您查询索引时,操作将消耗索引的读取容量;当您在具有全局索引的表中执行写入操作(创建、更新、删除)时,将有两个写入操作,一个用于表,另一个用于索引*

*定义全局二级索引的已配置吞吐量时,请确保特别注意以下要求:

为了使表写入成功,配置的吞吐量 表及其所有全局二级索引的设置必须 有足够的写容量来容纳写操作;否则 将限制对表的写入

  • 管理层:
只有在创建表时才能创建本地次索引,无法将本地次索引添加到现有表中,而且一旦创建了索引,也无法将其删除

创建表并将其添加到现有表时,可以创建全局次索引,也可以删除现有全局次索引

  • 读取一致性:
本地二级索引支持最终一致性或强一致性,而全局二级索引仅支持最终一致性

  • 预测:
本地二级索引允许检索未投影到索引的属性(尽管会带来额外的成本:性能和消耗的容量单位)。使用全局辅助索引,您只能检索投影到索引的属性

关于定义到二级索引的键的唯一性的特殊考虑:

在本地二级索引中,对于给定的哈希键值,范围键值不需要是唯一的,同样的事情也适用于全局二级索引,键值(哈希和范围)不需要是唯一的


来源:

一种说法是:

LSI—允许您在使用多个不同属性“过滤”或限制查询的同时,对单个哈希键执行查询

GSI—允许您对一个表中的多个哈希键执行查询,但因此会增加吞吐量

表类型及其工作方式的更广泛细分如下:

仅散列

你可能已经知道了;哈希键本身必须是唯一的,因为写入已存在的哈希键将覆盖现有数据

散列+范围

哈希键+范围键允许您有多个
queryExpression.setConsistentRead(false);