首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamoDB中局部索引和全局索引的差异

DynamoDB中局部索引和全局索引的差异
EN

Stack Overflow用户
提问于 2014-01-27 13:07:50
回答 6查看 90.5K关注 0票数 190

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-01-27 14:37:21

本地辅助索引仍然依赖原始哈希键。当您使用hash+range提供表时,请将LSI看作是hash+range1,hash+range2。hash+range6。您将获得5个需要查询的范围属性。此外,只有一个预先提供的吞吐量。

全局辅助索引定义了一个新的范例--每个索引都有不同的哈希/范围键。

这破坏了每个表中一个哈希键的原始用法。这也是为什么在定义GSI时,需要为每个索引添加一个预先提供的吞吐量,并为此付费。

有关这些差异的更详细信息可以在GSI announcement中找到。

票数 144
EN

Stack Overflow用户

发布于 2015-04-21 14:39:34

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

全局辅助索引--一个具有散列和范围键的索引,可以与表中的索引不同。全局辅助索引被认为是“全局的”,因为对索引的查询可以跨越表中的所有数据,跨越所有分区。 本地辅助索引-具有与表相同的散列键的索引,但具有不同的范围键。本地辅助索引是“本地的”,因为本地辅助索引的每个分区都限定为具有相同哈希键的表分区。

然而,在关键定义方面,差异远远超出了可能性。以下是一些直接影响维护索引的成本和努力的重要因素:

  • 吞吐量:

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

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

*在定义全球二级索引的供应吞吐量时,请确保您特别注意以下要求:

为了使表写入成功,为表及其所有全局辅助索引提供的吞吐量设置必须有足够的写入容量来容纳写入;否则,对表的写入将受到限制。

  • 管理:

只能在创建表时创建本地辅助索引,因此无法将本地辅助索引添加到现有表中,而且一旦创建索引,也无法删除该索引。

创建表并添加到现有表时可以创建全局辅助索引,还允许删除现有的全局辅助索引。

  • 阅读一致性:

本地二级索引支持最终或强一致性,而全局二级索引只支持最终一致性。

  • 预测:

本地辅助索引允许检索没有投射到索引中的属性(尽管有额外的成本:性能和消耗的容量单位)。使用全局辅助索引,您只能检索映射到索引的属性。

关于二次指标所定义的键唯一性的特殊考虑:

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

来源:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html

票数 130
EN

Stack Overflow用户

发布于 2014-03-27 10:41:09

以下是按索引进行的可能搜索:

  • 哈什
  • 通过哈希+范围
  • 通过Hash +局部索引
  • 按全球指数
  • 按全球指数+范围指数

表的哈希和范围索引:--这些是Amazon以前版本的常用索引。

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

  • 对于全局索引: @DynamoDBIndexHashKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS) @DynamoDBAttribute(attributeName = PROPERTY_USER)公共字符串getUser() {返回用户;}
  • 对于与全局索引关联的范围索引: @DynamoDBIndexRangeKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS) @DynamoDBAttribute(attributeName = PROPERTY_TIMESTAMP)公共字符串getTimestamp() {返回时间戳;}

此外,如果通过全局索引读取表,则必须是最终读取(不一致读取):

代码语言:javascript
复制
queryExpression.setConsistentRead(false);
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21381744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档