DynamoDB有2种类型的索引:本地二级索引和全局二级索引,那么本地二级索引是什么,它有什么作用呢?今天我们就来一起聊聊DynamoDB的本地二级索引

概念

本地二级索引本质上是一种数据结构(类同于mysql中的索引的概念)。每个本地二级索引必须和一个表关联,这个表称为索引的基表,级索引可以包含基表中的某些或者全部属性。
如下图,可以把索引看作和表一样的数据结构,这样我们就能可以使用Query或者Scan从索引中检索数据。

创建二级索引时,从基表投影或复制到索引中的属性,一般包含三种模式:

  1. 所有字段模式:基础表的所有属性都投影到索引中
  2. 只有keys模式:只有索引和主键被投影到索引中
  3. 包含模式:索引和主键以及额外指定的其他非键属性

为什么需要本地二级索引

比如下面的一张User表,Partition key为Id,Sort key为UserId,当我们需要根据非属性字段Age查询所有30岁的用户时,我们就不得不全表扫描表,当表的数据达到千万甚至更大时,
这将会消耗大量的时间,因此我们会想,能不能像mysql一样,给Age字段增加一个索引。Nice,思路相当OK,为非属性字段创建索引,这就是DynamoDB的二级索引。

本地二级索引的创建

创建本地二级索引的方式有多种,这里提供两种常见的方式

控制台可视化创建

操作可以参考下图:


注意:在创建表的时候 Table settings 一定要选择 Customize settings(自定义),这样才能够创建本地二级索引。

点击 Create local index 按钮,弹出如下图的界面:

这里的Sort key和我们上面符合索引中的Partition key和Sort key不一样就ok了,比如:我这里填写的是Age, 点击Create table按钮,最后表创建完成,在表的索引列里面可以看到我们创建的本地二级索引:

当我们再创建表的时候,只填写Partition key,不填写Sort key,然后创建本地索引时,会报错,如下图:

图中错误的意思就是创建本地二级索引时,需要指定一个range key,这样就证明是 本地二级只能在具有复合主键的表上添加,而且必须是在创建表的时候创建。

aws指令创建

aws指令是亚马逊提供的一套本地操作产品的指令,有点类似mysql的client指令,我们可以参考官方文档进行安装

$ aws dynamodb create-table \--table-name test \--attribute-definitions '[{"AttributeName": "Id","AttributeType": "S"},{"AttributeName": "Age","AttributeType": "N"},{"AttributeName": "Name","AttributeType": "S"}]' \--key-schema '[{"AttributeName": "Id","KeyType": "HASH"},{"AttributeName": "Age","KeyType": "RANGE"}]' \--local-secondary-indexes '[{"IndexName": "Age-index","KeySchema": [{"AttributeName": "Id","KeyType": "HASH"},{"AttributeName": "Age","KeyType": "RANGE"}],"Projection": {"ProjectionType": "KEYS_ONLY"}}]' \--provisioned-throughput '{"ReadCapacityUnits": 1,"WriteCapacityUnits": 1}' \

本地二级索引的使用

在上文中我们创建了一个本地二级索引 Age-index,我们需要使用该本地二级索引从test表中查询age=30的用户,java代码例子如下:

public class Test {public static void main(String[] args) {String tableName = "Test";DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider()));Table table = dynamoDB.getTable(tableName);Index index = table.getIndex("Age-index");QuerySpec spec = new QuerySpec().withKeyConditionExpression("Age = :age").withValueMap(new ValueMap().withInt(":age", 30));// index.query(), 把index作为一个数据载体作为查询,是不是很类同有table.query()?ItemCollection<QueryOutcome> items = index.query(spec);Iterator<Item> itemsIter = items.iterator();while (itemsIter.hasNext()) {Item item = itemsIter.next();}}
}

注意事项

  • 本地二级索引与基表拥有相同的Hash键(Partition key),不同的Range键(Sort key);
  • 本地二级索引只能在具有复合主键的表上添加并且是创建基表时创建,不能在现有的表上去添加;
  • 对于任何本地二级索引,每个不同的分区键值(Partition key)最多可以存储10GB的数据,此数字包括基表中的所有Item,以及索引中具有相同分区键值的所有Item;
  • 每个本地二级索引都会自动包含其基表中的分区键和排序键;
  • DynamoDB会自动维护本地二级索引,当表中有增、删、改操作时,DynamoDB 会自动把数据的变动维护到索引中;

吞吐量和成本权衡

亚马逊把DynamoDB封装得如此开箱即用也不是没有目的,那就是商业付费,因此我们在使用本地二级索引时需要根据自己的使用场景来权衡吞吐量和成本,主要有如下的场景

  • 尽可能低的延迟访问少数属性,可以考虑仅将这些属性投影到本地二级索引中。索引越小,存储成本就越低,写入成本也就越低。

  • 经常访问一些非关键属性,可以考虑将这些属性投影到本地二级索引中。本地二级索引的额外存储成本抵消了执行频繁表扫描的成本。

  • 频繁访问大多数非键属性,可以考虑将这些属性(甚至整个基表)投影到本地二级索引中。这种方式提供了最大的灵活性和最低的预置吞吐量消耗,因为不需要提取。但是,因为投影了所有属性,存储成本会增加。

  • 写入或更新频繁,查询较少,可以考虑KEYS_ONLY模式投影到本地二级索引中。本地二级索引将具有最小大小,但在查询活动需要时仍然可用。

本地二级索引适用范围

本地二级索引限制了必须和基表拥有相同的Partition key,而Sort key可以灵活变更,因此 本地二级索引其实就是扩展了基表复合主键的Sort key。

原文链接

DynamoDB系列之--本地二级索引相关推荐

  1. Phoenix 二级索引 的使用

    二级索引 二级索引是从主访问路径访问数据的一种正交方式.在HBase中,你有一个索引,它按照主行键按字典顺序排序.除了通过主行之外,以任何方式访问记录都可能需要扫描表中的所有行,以便根据筛选器对它们进 ...

  2. HBase优化之Apache Phoenix二级索引

    索引分类 全局索引 本地索引 覆盖索引 函数索引 全局索引 全局索引适用于读多写少业务 当构建了全局索引时,Phoenix会拦截写入(DELETE.UPSERT值和UPSERT SELECT)上的数据 ...

  3. Phonenix4.9 (添加二级索引,新版本本地索引表变更) hbase1.25的集成测试

    1.安装habse 1.25 2.下载并且解压  Phonenix 4.9  (所有节点) 我用的是:apache-phoenix-4.9.0-HBase-1.2-bin.tar.gz 3. 将Pho ...

  4. 2021年大数据HBase(十二):Apache Phoenix 二级索引

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Apache Phoenix 二级索引 一.索引分类 ...

  5. hbase基于solr配置二级索引

    一.概述 Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase Sec ...

  6. Solr-Hbase 二级索引的实现

    为什么HBase要建立二级索引 在HBase中检索数据通常有以下三种方式: 通过get, 指定RowKey获取唯一一条记录 通过scan, 设置start和stop进行范围匹配 全表扫描 所以我们发现 ...

  7. 基于Solr的Hbase二级索引

    关于Hbase二级索引 HBase 是一个列存数据库,每行数据只有一个主键RowKey,无法依据指定列的数据进行检索.查询时需要通过RowKey进行检索,然后查看指定列的数据是什么,效率低下.在实际应 ...

  8. HBase+Solr 的 二级索引 实时查询

    零.概述 1.Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase S ...

  9. Phoenix二级索引(Secondary Indexing)的使用(转:https://www.cnblogs.com/MOBIN/p/5467284.html)

    摘要 HBase只提供了一个基于字典排序的主键索引,在查询中你只能通过行键查询或扫描全表来获取数据,使用Phoenix提供的二级索引,可以避免在查询数据时全表扫描,提高查过性能,提升查询效率 测试环境 ...

最新文章

  1. 在VS中设置预编译头从而提高编译速度
  2. 2020-06-18 CVPR2020 VL论文讨论(1) 笔记
  3. 我在富士康挨踢了七年(八.出国Support)
  4. VHDL数字钟的设计与制作
  5. 如何查看keepalived版本号_Keepalived介绍 , 配置说明 , 及实际应用
  6. Css内边距与外边距
  7. 坯子库安装不上_柜式七氟丙烷的安装调试方法
  8. 如何写一个不带BOM的UTF8文件
  9. 华为2018年收入超阿里腾讯总和,任正非:华为最大问题是赚钱太多
  10. python Selenium调用 IE/GoogleChrome/Firefox浏览器驱动的方法及下载地址
  11. C程序范例(3)——结构体
  12. 【CS231n_2017】1-Introduction to CNN for Visual Recognition
  13. CF-1208D-线段树和树状数组双解
  14. java中的多态与继承_Java中继承与多态
  15. unity 打开摄像头(图像倒立的变换) 和显示所有摄像头的名称
  16. Atitit 并发锁机制 艾提拉总结 目录 1. 2. 用的比较频繁锁 2 1.1. 语法锁sync api锁 2 1.2. 数据库标志位锁 2 1.3. 文件锁 2 2. 锁得类型 3 2 2.
  17. vc mysql ado blob_在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除。...
  18. 清华团队夺冠清华-新南威尔士中澳数据科学大赛!跨学科交叉人才走出国门
  19. MATLAB柱状图去掉黑色边框
  20. StringBuffer的理解

热门文章

  1. 玩 原来有个 腾讯热腾
  2. 嵌入式方面名词术语总结
  3. 海思3516开发记录-AAC音频解码
  4. 微服务拆分原则之 AKF
  5. D3D粒子系统设计关键要点
  6. 潘多拉固件设置ipv6_openwrt-LEDE系统IPV6设置教程
  7. 【NVMe2.0b 12】NVM 容量模型
  8. java swing开发窗体程序开发(四)MVC结构
  9. 网页忘记密码怎么办?一招帮你找回密码!
  10. 农业无人机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告