View a markdown version of this page

索引创建 - Amazon DocumentDB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

索引创建

在 Amazon DocumentDB 中创建索引需要做出一些决定:

  • 需要多久完成?

  • 在构建过程中无法访问该集合吗?

  • 实例的计算能力中有多少可以分配给构建?

  • 应该创建什么类型的索引?

本节帮助您回答这些问题,并提供在基于实例的集群集合上创建 Amazon DocumentDB 索引的命令和监控示例。

指南要求

以下指南包括创建新索引时的基本限制和配置权衡:

  • Amazon DocumentDB 版本支持:虽然所有版本的 Amazon DocumentDB 都支持单工作进程索引,但只有 Amazon DocumentDB 版本 4.0 和 5.0 支持多工作进程索引。

  • 性能权衡:在索引创建过程中增加工作进程数量会增加 Amazon DocumentDB 数据库主实例上的 CPU 利用率和读取 IO。创建新索引所需的资源将无法用于正在运行的工作负载。

  • 弹性集群:Amazon DocumentDB 弹性集群不支持并行索引。

  • 最大工作进程:您可以配置的最大工作进程取决于数据库集群中主实例的大小。其等于数据库集群中主实例上 vCPU 总数的一半。例如,在有 64 个 vCPU 的 db.r6g.16xlarge 实例上,你最多可以运行 32 个工作进程。

注意

2xlarge 及以上的实例支持并行索引构建。

  • 最少工作进程:您可以配置的最小工作进程为 1。在基于实例的集群上创建索引的默认设置是两个工作进程。但是,您可以使用 “工作线程” 选项将工作线程数减少到一个。这将使用单工作进程运行该进程。

  • 索引压缩:Amazon DocumentDB 不支持索引压缩。索引的数据大小可能比您使用其他选项时更大。

  • 索引多个集合:数据库集群主实例上一半的 vCPU 可用于已配置的工作进程对多个集合执行索引创建。

  • 索引类型-有关 Amazon DocumentDB 上支持的索引类型的列表,请参阅索引类型

索引构建类型

索引构建的四种类型是:

  • Foreground:在索引创建完成之前,前台索引构建会阻止对创建索引的集合进行的所有其他数据库操作。Amazon DocumentDB 前台构建由五个阶段组成。

  • 前台(唯一):单个文档(唯一)前台索引构建会阻止其他数据库操作,例如常规的前台构建。与基本前台构建不同,唯一构建使用额外的阶段(排序键 2)来查找重复的键。前台(唯一)构建由六个阶段组成。

  • 背景:后台索引构建允许在创建索引时在前台运行其他数据库操作。Amazon DocumentDB 后台构建由八个阶段组成。

  • 背景(唯一):单个文档(唯一)后台索引构建允许在创建索引时在前台运行其他数据库操作。与基本背景构建不同,唯一构建使用额外的阶段(排序键 2)来查找重复的键。后台(唯一)构建由九个阶段组成。

默认索引构建类型为前台。

要在后台构建索引,请在创建索引时添加 “background”: true 参数。

开始使用

要开始在集合上创建索引,请使用 createIndexes 命令。默认情况下,该命令将运行两个并行工作进程,可将索引创建过程的速度提高两倍。

例如,以下命令过程演示了如何为文档中的 “user_name” 字段创建索引,并将索引处理速度提高到四个工作程序:

  1. 在集群上使用两个 parallel worker 在后台创建索引:

    db.runCommand({"createIndexes":"test","indexes":[{"key": {"user_name":1}, "name":"username_idx", "background":true }]})
  2. 要优化索引创建过程的速度,您可以使用 <number>db.runCommand createIndexes 命令中的 “工作线程” 选项(“工作线程”:)来指定工作线程数。

    将处理速度提至四个并行工作进程:

    db.runCommand({"createIndexes":"test","indexes":[{"key": {"user_name":1}, "name":"username_idx", "workers":4}]})
注意

工作进程数越多,则索引创建速度越快。但是,工作进程数增幅越大,主实例的 vCPU 的加载及 IO 的读取增速越快。确保您的集群配置充足,足以应对增加的负担,不会使其他工作负载降级。

索引进度状态

索引创建过程的工作原理是初始化、扫描集合、排序键,最后通过索引生成器插入键。在前台运行时,该过程最多有六个阶段,在后台运行时,则最多有九个阶段。您可以逐阶段查看状态指标,例如完成百分比、扫描的存储块总数、已排序键和已插入键。

在 mongo shell 中使用 db.currenTop () 命令监控索引过程的进度。最后一个阶段的 100% 已完成表示所有索引都已成功创建:

db.currentOp({"command.createIndexes": { $exists : true } })
注意

仅支持在 Amazon DocumentDB 5.0 上查看索引进度状态。

索引构建阶段

暂存区 前台 前台(唯一) 背景 背景(唯一)
INITIALIZING 1 1 1 1
构建索引:初始化 2 2 2 2
构建索引:扫描集合 3 3 3 3
构建索引:排序键 1 4 4 4 4
构建索引:排序键 2 5 5
构建索引:插入键 5 6 5 6
验证:扫描索引 6 7
验证:排序元组 7 8
验证:扫描集合 8 9
  • 正在初始化:createIndex 正在准备索引生成器。该阶段应该非常短暂。

  • 构建索引:正在初始化:索引生成器正在准备创建索引。该阶段应该非常短暂。

  • 构建索引:扫描集合:索引生成器正在执行集合扫描以收集索引秘钥。计量单位是 “块”。

注意

如果为索引构建配置了多个工作进程,则在此阶段将显示该工作进程。“扫描集合” 阶段是在索引构建过程中使用多个工作线程的唯一阶段。所有其他阶段将显示单工作进程。

  • 构建索引:排序键 1:索引生成器正在排序已收集的索引键。计量单位是 “钥匙”。

  • 构建索引:排序键 2:索引生成器正在对收集的与死元组相对应的索引键进行排序。此阶段仅适用于唯一索引构建。计量单位是 “钥匙”。

  • 构建索引:插入键:索引生成器正在将索引键插入到新索引中。计量单位是 “钥匙”。

  • 验证:扫描索引:createIndex 正在扫描索引以查找需要验证的键。计量单位是 “块”。

  • 验证:排序元组:createIndex 正在排序索引扫描阶段的输出。

  • 验证:扫描集合:CreateIndex 正在扫描集合以验证在前两个阶段中找到的索引键。计量单位是 “块”。

索引构建输出示例

在以下输出示例(前台索引构建)中,显示了索引创建的状态。“msg” 字段通过指明构建的阶段和完成百分比来汇总构建进度。“workers” 字段表示在索引构建的该阶段使用的工作器数量。“进度” 字段显示用于计算完成百分比的实际数字。

注意

亚马逊 DocumentDB 版本 4.0 不支持 IndexBuildName “当前”、“消息” 和 “进度” 字段。

{ "inprog" : [{ … "command": { "createIndexes": "test", "indexes": [{ "v": 2, "key": { "user_name": 1 }, "name": "user_name_1" }], "lsid": { "id": UUID("094d0fba-8f41-4373-82c3-7c4c7b5ff13b") }, "$db": "test" }, "currentIndexBuildName": user_name_1, "msg": "Index Build: building index number_1, stage 6/6 building index: 656860/1003520 (keys) 65%", "workers": 1, "progress": { "done": 656861, "total": 1003520 }, … ], "ok" : 1 }

资源问题排查

有关解决索引创建问题,请参阅以下资源: