MongoDB-CN-Manual
  • MongoDB中文手册|官方文档中文版
  • MongoDB用户手册说明
  • MongoDB简介
    • 入门
    • 数据库和集合
      • 视图
      • 按需物化视图
      • 封顶集合
      • 时间序列集合
    • 文档
    • BSON类型
      • Comparison and Sort Order
      • MongoDB Extended JSON (v2)
      • MongoDB Extended JSON (v1)
  • 安装 MongoDB
    • 安装MongoDB社区版
      • 在Linux上安装MongoDB社区版
      • 在macOS上安装MongoDB社区版
      • 在Windows上安装MongoDB社区版
    • 安装MongoDB企业版
      • 在Linux上安装MongoDB企业版
      • 在Mac OS安装MongoDB企业版
      • 在Windows安装MongoDB企业版
      • 使用Docker安装MongoDB企业版
    • 将社区版MongoDB升级到企业版MongoDB
    • 验证MongoDB软件包的完整性
  • The mongo Shell
    • 配置mongo Shell
    • 使用 mongo Shell帮助
    • 为mongo Shell编写脚本
    • mongo Shell中的数据类型
    • mongo Shell 快速参考
  • MongoDB CRUD操作
    • 插入文档
      • 插入方法
    • 查询文档
      • 在mongo Shell中迭代游标
      • 从查询返回的项目字段
      • 查询嵌入式文档数组
      • 查询数组
      • 查询空字段或缺少字段
      • 查询嵌入/嵌套文档
    • 更新文档
      • 更新方法
      • 聚合管道更新
    • 删除文档
      • 删除方法
    • 地理空间查询
      • 用地理空间查询查找餐馆
      • GeoJSON对象
    • 批量写入操作
    • 可重试写入
    • 可重试读取
    • SQL到MongoDB的映射图表
    • 文本搜索
      • 文本索引
      • 文本索引操作
      • 集合管道中的文本索引
      • 文本索引语言
    • Read Concern读关注
      • 读关注 "local"
      • 读关注 "available"
      • 读关注 "majority"
      • 读关注 "linearizable"
      • 读关注 "snapshot"
    • Write Concern写关注
    • MongoDB CRUD概念
      • 原子性和事务
      • 读隔离性,一致性和近因性
        • 因果一致性和读写关注
      • 分布式查询
      • 通过findAndModify进行线性化读取
      • 查询计划
      • 查询优化
        • 评估当前操作性能
        • 优化查询性能
        • 写操作性能
        • 说明结果
      • 分析查询表现
      • Tailable 游标
  • MongoDB聚合
    • 聚合管道
      • 聚合管道优化
      • 聚合管道限制
      • 聚合管道和分片集合
      • 使用 Zip Code 数据集进行聚合
      • 使用用户首选项数据进行聚合
    • Map-Reduce
      • Map-Reduce 和分片集合
      • Map-Reduce 并发
      • Map-Reduce 示例
      • 执行增量 Map-Reduce
      • 对 Map Function 进行故障排除
      • 排除 Reduce Function 问题
      • Map-Reduce转换到聚合管道
    • 聚合参考
      • 聚合管道快速参考
      • 聚合命令
      • 聚合命令对比
      • 聚合表达式中的变量
      • SQL 到聚合映射图表
  • MongoDB数据模型
    • 数据建模介绍
    • 模式验证
    • 数据模型设计
      • 一对一嵌套关系模型
  • MongoDB事务
  • MongoDB事务
    • 驱动程序 API
    • 生产注意事项
    • 生产注意事项 (分片集群)
    • 事务操作
  • MongoDB索引
    • 单字段索引
    • 复合索引
    • 多键索引
      • 多键索引范围
    • 文本索引
      • 为文本索引指定语言
      • 指定文本索引的名称
      • 用权重控制搜索结果
      • 限制扫描条目的数量
    • 通配符索引
      • 通配符索引限制
    • 2dsphere 索引
      • 查询一个2dsphere索引
    • 2d 索引
      • 创建一个2d索引
      • 查询一个2d索引
      • 2d索引内部
      • 使用球面几何计算距离
    • geoHaystack 索引
      • 创建Haystack索引
      • 查询Haystack索引
    • 哈希索引
    • 索引特性
      • TTL 索引
        • 通过设置TTL使集合中的数据过期
      • 唯一索引
      • 部分索引
      • 不分大小写索引
      • Sparse 索引
    • 在填充的集合上建立索引
      • 在副本集上建立滚动索引
      • 在分片群集上建立滚动索引
    • 索引交集
    • 管理索引
    • 衡量索引使用
    • 索引策略
      • 创建索引来支持查询
      • 使用索引对查询结果进行排序
      • 确保索引适合RAM
      • 创建以确保选择性的查询
    • 索引参考
  • MongoDB安全
    • 安全检查列表
    • 启用访问控制
    • 身份验证
      • 用户
        • 添加用户
        • 权限认证机制
          • SCRAM
            • 用x.509证书来认证客户端
    • 审计
      • 配置审计过滤器
      • 配置审计
      • 系统事件审计消息
    • 网络和配置强化
    • 安全参考
      • system.roles集合
      • system.users集合
      • 资源文档
      • 权限操作
    • 附录
      • 附录-A-用于测试的 OpenSSl CA 证书
      • 附录-B-用于测试的OpenSSL服务器证书
      • 附录-C-用于测试的OpenSSL客户端证书
  • Change Streams变更流
    • 变更流生产建议
    • 变更事件
  • MongoDB复制
    • 副本集成员
    • 副本集日志
    • 副本集数据同步
    • 副本集部署架构
    • 副本集成员配置教程
    • 副本集维护教程
    • MongoDB复制参考
  • MongoDB分片
    • 分片集群组件
    • 分片键
    • 哈希分片
    • 范围分片
    • 区
      • 管理分片区
      • 按位置细分数据
      • 用于更改SLA或SLO的分层硬件
      • 按应用或客户细分数据
      • 仅插入工作负载的分布式本地写入
      • 管理分片区
    • 使用块进行数据分区
      • 在分片集群中拆分数据块
    • 分片管理
      • 查看集群设置
    • 重启一个分片集群
    • [把一个分片集群迁移到不同的硬件](fen-pian/migrate-a -sharded-cluster-to-different-hardware.md)
    • 分片参考
  • MongoDB管理
    • 产品说明
    • 操作检查列表
    • 开发检查列表
    • 配置和维护
    • 性能
    • 数据中心意识
      • MongoDB部署中的工作负载隔离
      • 区
        • 管理分片区
        • 按位置细分数据
        • 用于更改SLA或SLO的分层硬件
        • 按应用或客户细分数据
        • 仅插入工作负载的分布式本地写入
        • 管理分片区
    • MongoDB备份方法
    • MongoDB监控
  • MongoDB存储
    • 存储引擎
      • WiredTiger 存储引擎
      • 内存存储引擎
    • 日志记录
      • 管理日志记录
        • GridFS
        • FAQ:MongoDB 存储
  • MongoDB参考
    • 运算符
      • 查询与映射运算符
        • 比较查询运算符
          • $eq
          • $gt
          • $gte
          • $in
          • $lt
          • $lte
          • $ne
          • $nin
        • 逻辑查询运算符
          • $and
          • $not
          • $nor
          • $or
        • 元素查询运算符
        • 评估查询运算符
        • 地理空间查询运算符
        • 数组查询运算符
        • 按位查询运算符
        • $comment
        • 映射运算符
      • 更新运算符
        • 字段更新运算符
        • 数组更新运算符
        • 按位更新运算符
      • 聚合管道阶段
      • 聚合管道操作符
        • $abs (aggregation)
        • $acos (aggregation)
        • $acosh (aggregation)
        • $add (aggregation)
        • $addToSet (aggregation)
        • $allElementsTrue (aggregation)
        • $and (aggregation)
        • $anyElementTrue (aggregation)
        • $arrayElemAt (aggregation)
        • $arrayToObject (aggregation)
        • $asin (aggregation)
        • $asinh (aggregation)
        • $atan (aggregation)
        • $atan2 (aggregation)
        • $atanh (aggregation)
        • $avg (aggregation)
        • $ceil (aggregation)
        • $cmp (aggregation)
        • $concat (aggregation)
        • $concatArrays (aggregation)
        • $cond (aggregation)
        • $convert (aggregation)
        • $cos (aggregation)
        • $dateFromParts (aggregation)
        • $dateToParts (aggregation)
        • $dateFromString (aggregation)
        • $literal (aggregation)
      • 查询修饰符
    • 数据库命令
      • 聚合命令
      • 地理空间命令
      • 查询和写操作命令
      • 查询计划缓存命令
      • 认证命令
      • 用户管理命令
      • 角色管理命令
      • 复制命令
      • 分片命令
      • 会话命令
      • 管理命令
      • 诊断命令
      • 免费监控命令
      • 系统事件审计命令
    • mongo Shell 方法
      • 集合方法
        • db.collection.aggregate()
        • db.collection.bulkWrite()
        • db.collection.copyTo()
        • db.collection.count()
        • db.collection.countDocuments()
        • db.collection.estimatedDocumentCount()
        • db.collection.createIndex()
        • db.collection.createIndexes()
        • db.collection.dataSize()
        • db.collection.deleteOne()
        • db.collection.deleteMany()
        • db.collection.distinct()
        • db.collection.drop()
        • db.collection.dropIndex()
        • db.collection.dropIndexes()
        • db.collection.ensureIndex()
        • db.collection.explain()
        • db.collection.find()
        • db.collection.findAndModify()
        • db.collection.findOne()
        • db.collection.findOneAndDelete()
        • db.collection.findOneAndReplace()
        • db.collection.findOneAndUpdate()
        • db.collection.getIndexes()
        • db.collection.getShardDistribution()
        • db.collection.getShardVersion()
        • db.collection.insert()
        • db.collection.insertOne()
        • db.collection.insertMany()
        • db.collection.isCapped()
        • db.collection.latencyStats()
        • db.collection.mapReduce()
        • db.collection.reIndex()
        • db.collection.remove()
        • db.collection.renameCollection()
        • db.collection.replaceOne()
        • db.collection.save()
        • db.collection.stats()
        • db.collection.storageSize()
        • db.collection.totalIndexSize()
        • db.collection.totalSize()
        • db.collection.update()
        • db.collection.updateOne()
        • db.collection.updateMany()
        • db.collection.watch()
        • db.collection.validate()
    • MongoDB中的限制与阈值
    • MongoDB系统集合
    • 词汇表
    • 默认的MongoDB端口
    • 默认的MongoDB读/写关注
    • 服务器会话
  • MongoDB FAQ
    • FAQ: MongoDB基础知识
    • FAQ: MongoDB索引
    • FAQ: MongoDB并发
    • FAQ: MongoDB分片
    • FAQ: MongoDB复制和副本集
    • FAQ: MongoDB存储
    • FAQ: MongoDB诊断
  • MongoDB 版本管理
  • 联系我们
    • Tapdata Cloud
    • MongoDB中文社区
    • 社区合作伙伴—锦木信息
由 GitBook 提供支持
在本页
  • 行为
  • 与前景和背景构建进行比较
  • 索引构建期间的冲突约束
  • 索引构建对数据库性能的影响
  • 复制集中的索引构建
  • 构建失败和恢复
  • 单个mongod进程的索引构建中断
  • Primary节点mongod进程的索引构建中断
  • Secondary节点mongod进程的索引构建中断
  • 构建过程中的回滚
  • 监视进行中的索引构建
  • 终止进行中的索引构建
  1. MongoDB索引

在填充的集合上建立索引

上一页Sparse 索引下一页在副本集上建立滚动索引

最后更新于3年前

在本页面

MongoDB 4.2版本新变化

针对已填充的集合的MongoDB索引构建需要对该集合的排他性读写锁定。需要对集合进行读取或写入锁定的操作必须等待,直到释放锁定为止 。MongoDB 4.2使用了优化的构建过程,该过程仅在索引构建的开始和结束时持有排他锁。其余的构建过程将产生交错的读写操作。

索引构建过程总结如下:

  1. 初始化

    进程对正在编制索引的集合使用独占锁。所有对该集合的读写操作将阻塞直到 进程释放锁。在此期间,应用程序无法访问集合。

  2. 数据摄取和加工 进程释放上一过程中获取的所有锁,然后针对被索引的集合获取一系列意向锁。在此期间,应用程序可以对集合发出读写操作。

  3. 清理 进程释放上一过程中获取的所有锁,然后针对被索引集合获取独占锁。这时将阻塞对该集合所有读写操作直到进程释放锁。应用程序此时无法访问该集合。

  4. 完成 进程标记索引状态为已可用,然后释放索引构建过程中的所有锁。

索引构建过程中的加锁描述细节参见章节。更深入了解MongoDB的加锁行为参见。

行为

与前景和背景构建进行比较

MongoDB的早期版本支持在前台或后台构建索引。前台索引构建速度很快,能够生成更高效的索引数据结构,但是需要在构建期间阻塞对被索引的集合的父数据库的所有读写访问。后台索引构建速度较慢,效率较低,但允许在构建过程中对数据库及其集合进行读写访问。

MongoDB 4.2版本变化

MongoDB 4.2索引构建只在构建过程的开始和结束时对被索引的集合获得独占锁,以保护元数据的更改。构建过程的其余部分使用后台索引构建的生成行为来最大化构建期间对集合的读写访问。4.2索引构建仍然产生高效的索引数据结构,尽管有更宽松的锁定行为。

MongoDB 4.2的索引构建性能至少与后台索引构建相当。对于在构建过程中很少或没有收到更新的工作负载,4.2索引构建构建的速度可以与基于相同数据的前台索引构建的速度一样快。

索引构建期间的冲突约束

降低因违反约束而导致索引生成失败的风险:

  • 校验集合中没有违反索引约束的文档。

  • 停止所有可能违反该集合索引约束条件的应用程序写入操作。

索引构建对数据库性能的影响

高负载写入时的索引构建

在目标集合处于高负载写入状态时执行索引构建操作,会造成写入性能下降和更长的索引构建时间。

考虑指定一个维护窗口用于构建索引,在此期间停止或减少对目标集合的写入操作。以减少索引生成过程对性能的潜在负面影响。

可用系统内存不足时的索引构建

复制集中的索引构建

尽量减少建立索引对以下方面的影响:

Secondaries节点可能不进行同步

或者在维护时间窗口中执行索引构建,应用程序停止对该索引集合的所有事物操作、写操作和元数据操作。

Secondary节点的索引构建可能造成读写操作延迟

MongoDB 4.2索引生成过程的开始和结束时获取正在索引的集合的独占锁。当secondary节点索引生成持有独占锁时,该secondary节点将暂停任何读写操作,直到索引生成释放该锁为止。

索引生成完成后,辅助进程索引将删除

在secondary节点完成索引构建的复制之前,在primary节点删除索引,将不会中断secondary节点的构建。当secondary节点执行索引删除的复制操作时,其须等待之前的索引生成操作执行复制完毕。此外,由于索引删除是集合上的元数据操作,因此索引删除会暂停该secondary节点上的复制。

构建失败和恢复

单个mongod进程的索引构建中断

Primary节点mongod进程的索引构建中断

Secondary节点mongod进程的索引构建中断

MONGODB 4.0以上版本

构建过程中的回滚

监视进行中的索引构建

终止进行中的索引构建

尽量降低复制集和拥有复制集的分片集群的构建索引影响,参见:

  • 索引建立过程

    如下表格描述索引构建过程中的每个阶段:

阶段
描述

Lock

初始化

Lock

扫描集合

进程端写入表

Lock

处理完临时端写表

Lock

下侧写表

流程约束违规表

将索引标记为就绪

Lock

译者:程哲欣

MongoDB 4.2索引构建完全替代了以前MongoDB版本中支持的索引构建过程。如果指定为 或它的shell助手和, MongoDB会忽略后台索引构建选项。

使用 命令监视正在进行的索引构建的进度。

对集合具有强制约束作用的索引,例如: 索引, 进程会在索引构建完成后对所有预先存在的和并发写入的文档进行约束性检查。如果任何文档违反了索引约束条件,进程将终止构建并抛出错误。

举例:对inventory集合的product_sku属性构建unique特性索引。如果任意文档的product_sku属性有重复值,索引构建过程仍可成功开始,如果在构建结束时仍然存在任何冲突,进程会终止构建并抛出错误。

类似的,在索引构建的过程中,应用程序可成功对inventory集合写入product_sku属性值重复的文档。如果在构建结束时存在任何索引约束冲突,进程会终止构建并抛出错误。

命令支持在集合上构建多个索引。命令同时使用内存和磁盘上的临时文件空间完成索引构建。命令默认的内存使用限制是500MB,该空间在所有使用命令生成的索引之间共享。一旦在构建索引时到达该空间限制,命令将使用目录下_tmp文件夹下的临时磁盘文件空间,用于完成索引构建。

你可以自定义参数,更改该空间大小限制。设置更高的内存空间可以在索引大小超500MB时更快完成索引构建。当然,该参数设置过高也会导致占用太多无用内存造成系统内存错误。

如果主机内存有限,你可能需要安排一个维护期,增加整个系统内存,再更改进程中的内存参数设置。

复制集中,使用滚动索引生成策略,如章节所述。

拥有分片复制集的分片集群中,使用滚动索引生成策略,如章节所述。

你可以在节点执行索引构建。索引生成完成后,secondaries节点进行复制并开始索引构建。复制集中在开始构建索引之前请注意如下风险:

Secondary节点的索引构建将阻塞应用正在执行的对构建索引集合的事务操作。 进程在构建索引完成前将无法使用任何oplog。

如果索引生成在执行操作或命令时持有独占锁,则对被索引集合的复制写操作也可能被延迟到索引构建完成之后。 进程无法使用任何oplog直到锁释放。如果复制延迟时间超过secondary节点的,secondary将不进行同步,需要通过来恢复。

在构建索引之前,使用命令鉴别每个副本集成员配置的时间区间中可处理的oplog大小。你可以增大oplog大小,降低不同步的概率。例如,设置oplog的窗口可以覆盖72个小时的操作记录,只要确保secondary节点可以容忍这么久的复制延迟。

如果进程在索引构建时终止了,索引构建任务和所有进程将丢失。重启进程不会重新执行索引构建,你必须重新运行 操作来重启索引构建。

如果primary节点在索引构建时停止了,索引构建任务和所有进程将丢失。你必须重新运行 操作来重启索引构建。

如果secondary节点在索引构建时停止了,索引构建任务将保留。重启 进程将恢复索引构建并从头重新开始。

启动进程会在任意已恢复的索引生成之后暂停。所有操作,包括复制将进入等待直到索引构建完成。如果secondary节点的oplog未在时间窗口区间完成缩影索引构建的复制,secondary不再进行这部分oplog的复制集的同步,需要恢复。

如果你重启了进程作为独立的复制集节点实例或删除)。mongod进程仍将从头恢复索引构建。你可以使用配置文件设置或写入命令行参数。

你不能对副本集中的一个进程实例,设置选项 或 选项。

从4.0版本开始,MongoDB在任意正在执行索引构建的进程完成后进行。

你可以在 shell中执行命令,查看索引构建操作的状态。筛选当前操作中的索引创建操作,参见操作。

包含了索引构建当前阶段的完成百分比。

终止primary节点或单个 mongod 进程中正在执行的索引构建命令,请在进程中使用命令。当终止索引生成时,命令可能不会立即执行,并可能在大部分索引生成操作完成后执行。

你无法终止一个已经在复制集secondary节点进行复制的索引构建操作。你必须首先在primary节点删除索引。secondary节点将复制删除操作并在索引构建完成后删除索引。所用复制操作将阻塞直到索引构建完成并执行完删除操作。

进程获得索引集合的独占X锁。该集合的所有读写操作被阻塞,包括应用程序对该集合所有复制写操作或者元数据指令。进程不会释放独占锁。

进程在该初始状态创建三个数据结构:初始索引元数据项。一张临时表("side writes table"),用来存储构建过程中对索引集合进行写入时生成的key。一张临时表(“constraint violation table”),用于存储可能导致重复键约束冲突的所有文档。

进程将之前获取的独占锁X降级为意图独占锁IX,[mongod]进程周期性的释放该锁,允许进行交错读写操作。

进程对集合中每个文档生成一个key,并将该key存储到外部分类器中,如果 进程在集合扫描期间发现重复key,它会将该key存储在constraint violation表中以备后续处理。如果mongod进程在生成key时遇到任何其他错误,构建将失败并出现错误。一旦mongod进程完成集合扫描,它将分类的key转储到索引中。

使用先进先出方式处理Side Writes Table表中数据,如果遇到重复key,将该key写入constraint violation table表以备后续处理。如果进程在处理键时出现任何异常错误,构建将失败。对于每个在索引构建过程中写入集合的文档,mongod进程都会给该文档生成一个key,并将其存储到side write table表中。使用快照系统设置要处理的key的数量限制。

进程将索引集合上的意图独占锁IX升级为共享S锁。这会阻塞该集合的所有写操作,包括应用程序对该集合的任何复制写操作或元数据操作。

进程继续处理Side Writes Table表中的存量数据。进程在该阶段可能会暂停复制。如果遇到重复key,将该key写入constraint violation table表以备后续处理。如果进程在处理键时出现任何异常错误,构建将失败。

进程将索引集合的共享S锁升级成独占X锁。该集合的所有读写操作被阻塞,包括应用程序对该集合所有复制写操作或者元数据指令操作。进程不会释放独占锁。

在处理完Side Write Table表中所有数据后将其删除。如果遇到重复key,将该key写入constraint violation table表以备后续处理。如果进程在处理键时出现任何异常错误,构建将失败。

进程使用先入先出的方式处理Constraint Violation Table表中数据,之后删除该表。如果其中任何键仍然出现重复键错误,将终止构建并抛出错误。进程在处理完Constraint Violation Table表后或出现重复键约束时将删除该表。

将索引元数据更新为可使用状态。

进程释放该索引集合的独占X锁。

行为
索引构建对数据库性能的影响
复制集中的索引构建
构建失败和恢复
监视进行中的索引构建
终止进行中的索引构建
索引建立过程
mongod
mongod
mongod
mongod
mongod
mongod
mongod
Index Build Process
FAQ: Concurrency
createIndexes
createIndexes()
createIndexes()
db.currentOp()
unique
mongod
mongod
mongod
mongod
createIndexes
createIndexes
createIndexes
createIndexes
--dbpath
maxIndexBuildMemoryUsageMegabytes
mongod
Build Indexes on Replica Sets
Build Indexes on Sharded Clusters
primary
mongod
mongod
oplog window
resynchronization
rs.printReplicationInfo()
increase the oplog size
mongod
mongod
createIndex()
createIndex()
mongod
resynchronization
mongod
--replSetName
storage.indexBuildRetry
--noIndexBuildRetry
mongod
storage.indexBuildRetry
--noIndexBuildRetry
rollback
mongo
db.currentOp()
Active Indexing Operations
msg
mongo
db.killOp()
db.killOp()
drop
在复制集上建立索引
在分片群集上建立索引
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod
mongod