什么是Secondary Indexes

二级索引的存在主要是为了支持基于不同字段的多种查询和排序操作.

DynamoDB表最基本的查询操作包括以下三种:

  • 一是根据主键进行查询,这是精确的查询,主键可以是只包含hashKey的简单主键,也可以是包含hashKey和rangeKey的组合主键
  • 二是根据hashKey进行查询操作,适用于组合主键的情况.可以获取拥有相同haskKey的所有数据,也就是查询操作是必须指定一个haskKey并以rangeKey进行排序,排序方式支持rangeKey升序或者降序.
  • 三是扫描(scan)整张表,这个是dynamodb不推荐的操作,因为cost比较大,扫描整张表就是会读取整张表,即便加了其他的filter条件,也是读取完所有的数据之后再做的过滤,扫描表的cost会按整张表的数据来计算,不光是花钱多,效率也很低,所以是dynamodb不推荐的操作.

综合上面三种操作我们发现,基于基表的查询操作比较局限, 只能支持一种特定的查询和排序操作.

那如果我想支持多种排序方式怎么办?

解决方案就是使用二级索引,二级索引有两种, Global Secondary Indexes和 Local Secondary Indexes.

特征 全局二级索引 本地二级索引
键架构 可以是简单主键(分区键)或复合主键(分区键和排序键) 必须是复合主键(分区键和排序键)
键属性 索引分区键和排序键 (如果有) 可以是字符串、数字或二进制类型的任何基表属性。 索引的分区键是与基表的分区键相同的属性。排序键可以是字符串、数字或二进制类型的任何基表属性。
每个分区键值的大小限制 没有大小限制 对于每个分区键值,所有索引项目的大小总必须为不超过 10 GB 
在线索引操作

可以在创建表时创建。

可以为现有的表创建新的全局二级索引

可以删除现有的全局二级索引

必须在创建表的同时创建

不能向现有表添加本地二级索引

不能删除已存在的任何本地二级索引

查询和分区 所有分区查询整个表。 查询分区键值指定的单个分区
读取一致性 仅支持最终一致性 支持最终一致性和强一致性
预置吞吐量使用

有自己的用于读取和写入活动的预置吞吐量设置

查询或扫描会占用索引(而非基表)的容量单位

不会影响基表的读写效率

查询或扫描占用基表的读取容量单位

一定程度上会影响基表的读写效率

投影属性 查询或扫描时只能获取到投影到索引上的属性, DynamoDB 不会从基表中获取任何数据 查询或扫描可以获取未投影到索引的属性,DynamoDB 会自动从基表中获取这些属性
创建个数 大部分区域默认配额为20个(个别几个区域为5个

  • AWS GovCloud (US-East)

  • AWS GovCloud (US-West)

  • Europe (Stockholm)

),可以联系AWS增加

最多五个,不可增加

综合上述不同,得出一个结论就是在不要求强一致性的情况下,GSI可以当LSI来用,如果要求强一致性,只能使用LSI.

创建二级索引

  • 索引类型 : 全局二级索引或本地二级索引。
  • 索引的名称:索引的命名规则与表的命名规则相同。同一个基表,索引的名称必须唯一,不同的基表相关联的索引的名称可以相同。
  • 索引的键架构: 索引键架构中的每个属性必须是类型为 StringNumber 或 Binary 的顶级属性。其他数据类型,包括文档和集,均不受支持。键架构的其他要求取决于索引的类型:
    • 对于全局二级索引,分区键可以是基表的任何标量属性。排序键是可选的,也可以是基表的任何标量属性。
    • 对于本地二级索引,分区键必须与基表的分区键相同,排序键必须是非键基表属性。
  • 属性投影(可选)。这些属性是除表键属性之外的属性,表键属性会自动投影到每个索引。可以投影任何数据类型的属性,包括标量、文档和集。
    • 属性投影是指从基表复制到二级索引的属性集
    • 表的分区键和排序键始终投影到索引中
    • 其他属性可以按需投影以支持应用程序的查询要求
    • 创建二级索引时,需要指定将投影到索引中的属性。DynamoDB 为此提供了三种不同的选项:
      • KEYS_ONLY— 索引中的每个项目仅包含基表的分区键、排序键值以及索引的键, 使用KEYS_ONLY时,二级索引占用空间最少
      • INCLUDE:— 包括指定的其他非键属性以及KEYS_ONLY包含的键属性
      • ALL— 二级索引包括源表中的所有属性。表的所有数据都会复制到索引中,二级索引占用空间最多
  • 索引的预置吞吐量设置:
    • 对于全局二级索引,必须指定读取和写入容量单位设置。这些预置吞吐量设置独立于基表的设置。
    • 对于本地二级索引,无需指定读取和写入容量单位设置。对本地二级索引执行的读取和写入操作会占用其基表的预置吞吐量设置。

最佳实践

  • 如果需要强一致性的查询,否只能使用LSI
  • 如果不需要强一致性的查询,则应该使用GSI
  • 最大程度地减少索引的数量。 不要对不常查询的属性创建二级索引。很少使用的索引会增加存储和 I/O 成本,而且无法提高应用程序性能。
  • 谨慎选择投影属性
    • 由于二级索引会占用存储空间和预配置吞吐量,因此应尽量减少投影属性的数量,以减少索引的大小,这仅在投影属性的大小大于单个写入容量单位 (1 KB) 时适用.如果索引条目的大小小于1kb,则应该投影尽可能多的属性以尽量避免从基表中读取数据,也不会额外增加成本.
    • 相较于查询整个表,索引越小,性能优势越明显
    • 如果查询通常只返回很少一部分属性,并且这些属性的总和远远少于整个项目的大小,那么应当只投影经常请求的属性
    • 避免投影在查询中极少需要的属性

Secondary Indexes案例分析及代码实现

参考微信的收藏数据设计,我们需要创建一张表用于存储用户收藏的数据,data model有如下结构:

  • userId
  • dataId
  • creatorId
  • title
  • thumbnailUrl
  • contentUrl
  • dataType
  • clipTime

根据需求,FavoriteDataDto有如下特性:

  • 根据userId和dataId获取用户收藏的特定数据
  • 获取用户收藏的所有数据,并按收藏时间降序排序
  • 获取所有某种特定类型的收藏数据,并按收藏时间降序排序

综上,​​我们需要以userId作为分区键, 以dataId作为排序键来创建一个组合键,这样就可以支持根据userId和dataId来获取特定数据,同时支持获取用户收藏的所有数据,并以dataId进行排序操作,只需要以userId作为hashKey进行query操作即可.

为了支持获取用户收藏的所有数据,并按收藏时间降序排序,需要创建一个Secondary Index, 这里用Global Secondary Index和Local Secondary Index都可以,根据最佳实践,没有强一致性的要求,因此我们使用Global Secondary Index, 分区键为clipTime&dataId,只需要以userId作为hashKey,对Global Secondary Index进行query操作即可.

此外,还需要创建一个Global Secondary Index, 分区键为userId&type, 排序键为clipTime&dataId,这样就可以支持获取所有某种特定类型的收藏数据,只需要以userId&type作为hashKey,对Global Secondary Index进行query操作即可.

案例分析及代码实现参考一下两篇文章

2. AWS DynamoDB实战之表的设计_JessicaWind的博客-CSDN博客

3. AWS DynamoDB实战之CRUD_JessicaWind的博客-CSDN博客

4. AWS DynamoDB实战之Secondary Indexes相关推荐

  1. 亚马逊 aws 指南 实战_减少您的AWS成本完整指南

    亚马逊 aws 指南 实战 Do you think your cloud costs are too high? I think most businesses can find savings i ...

  2. AWS DynamoDB 常用操作

    在上篇blog 简单介绍了 DynamoDB 初步使用.但DynamoDb实际上使用与mongodb 有很大差异,这里自己用到一些操作方式(查询 更新 批量删除)做一些说明. 所有操作均基于:node ...

  3. aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作

    总结一下 dynamodb通常和java等后端sdk结合使用 使用的形式可以是api或partiql语法调用 dynamodb的用法不难,更重要的是维护成本,所需的服务集成,技术选型等 和大数据结合场 ...

  4. 云计算机入门教学视频,AWS云计算实战-基础篇视频课程

    <AWS云计算实战>系列课程中基础篇.通过学习你可以: ● 识别与AWS平台相关的术语和概念,学习使用AWS管理控制台和命令行. ● 了解最核心的基础服务,包括计算.网络和两种存储 ● 了 ...

  5. aws dynamodb_使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

    aws dynamodb 将任何实体上的版本属性保存到 AWS DynamoDB数据库,它只是表示已修改实体次数的数字表示. 首次创建实体时,可以将其设置为1,然后在每次更新时递增. 好处是立竿见影的 ...

  6. aws dynamodb_带有AWS DynamoDB的React式Spring Webflux

    aws dynamodb AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO. 在本文中,我将探讨如何使用AWS开发工具包2.x的Dyn ...

  7. 使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

    将任何实体上的版本属性保存到 AWS DynamoDB数据库,它仅是表示实体已修改次数的数字表示. 首次创建实体时,可以将其设置为1,然后在每次更新时递增. 好处是立竿见影的-指示实体已被修改的次数, ...

  8. phoenix创建索引报错“ Mutable secondary indexes must have the hbase.regionserver.wal.codec property”

    phoenix 创建hbase表索引时异常,报错如下 Error: ERROR 1029 (42Y88): Mutable secondary indexes must have the hbase. ...

  9. AWS DynamoDB基础使用

    因AWS并没有提供mongodb的云服务.所以需要将数据库从mongodb切换到AWS 的dynamodb. Dynamodb 提供了本地调试版本,本文主要介绍dynamodb本地调试使用. 数据库环 ...

  10. 带有AWS DynamoDB的反应式Spring Webflux

    AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO. 在本文中,我将探讨如何使用AWS开发工具包2.x的DynamoDB API以及如何 ...

最新文章

  1. Keypress - 捕获键盘输入的JavaScript库
  2. “防爆”与“防暴” 这两种摄像机差别在哪?
  3. python3.7安装wordcloud_Python中的wordcloud库安装问题及解决方法
  4. 下一代大数据即时分析架构--IOTA架构
  5. System.Text.Json 中的字符编码
  6. Leetcode--78. 子集
  7. swift 2.1 安裝與下載
  8. pytorch 实现 LSTM AutoEncoder 与案例
  9. Python+selenium+PhantomJS获取百度搜索结果真实链接地址
  10. 编程语言对比 容器
  11. idea中查看maven依赖树
  12. 2d isometric 坐标变换
  13. springboot毕设项目超市仓库管理系统15g4i(java+VUE+Mybatis+Maven+Mysql)
  14. 《mysql必知必会》学习笔记
  15. 感慨一下中年人的焦虑
  16. java俄罗斯方块七中图形类_用shell写俄罗斯方块
  17. mysql 绿色版的安装过程和配置
  18. 几分钟黑掉阿里,被马云500万年薪收编的黑客,现在混得咋样了?
  19. ciscn_2019_n_7(exit_hook)、wdb_2018_1st_babyheap(fsop的例子)
  20. 《万历十五年》的读后感范文3380字

热门文章

  1. Ubuntu 锁屏后键盘无法输入密码
  2. 软件工程之美学习笔记二十五 24 | 技术债务:是继续修修补补凑合着用,还是推翻重来?
  3. eclipse更改J2EE对应的Web版本
  4. vml时序表_Vml:美洲豹系列教程之十一(数据图表)
  5. 计算机课教学常规要求,2020学校教学常规管理制度
  6. 测试用例之因果图分析法
  7. H5 img标签图片无法显示 -- 解决方案
  8. 语音识别中的鸡尾酒会问题
  9. 手机游戏满江红里的诗句
  10. 基于微信评选投票小程序系统设计与实现 开题报告