MongoDB Manual (Version 4.2)> Indexes > Index Builds on Populated Collections
本次我们将从以下几方面来了解如何在MongoDB集合上创建索引。
行为
索引构建对数据库性能的影响
复制集环境的索引生成
构建失败和恢复
监视正在进行的索引生成
终止正在进行的索引生成
索引生成过程
MongoDB 4.2版本新变化
对指定集合构建索引时会独占该集合的读写锁(注:构建索引时会锁表)。对集合构建索引时该集合读和写操作会加锁,直到mongod
进程完成索引构建,该集合的读写操作锁才会释放。MongoDB 4.2对该过程进行了优化,仅在索引生成的开始和结束保留独占锁,构建索引的其余过程可对该集合进行交错读写操作。(注:MongoDB 4.2缩短了索引创建时的锁表时间)
索引构建过程汇总如下:
1. 初始化
mongod
进程对正在编制索引的集合使用独占锁。所有对该集合的读写操作将阻塞直到mongod
进程释放锁。在此期间,应用程序无法访问集合。
2. 数据提取和加工
mongod
进程释放上一过程中获取的所有锁,然后针对被索引的集合获取一系列意向锁。在此期间,应用程序可以对集合发出读写操作。
3. 清理
mongod
进程释放上一过程中获取的所有锁,然后针对被索引集合获取独占锁。这时将阻塞对该集合所有读写操作直到mongod
进程释放锁。应用程序此时无法访问该集合。
4. 完成
mongod
进程标记索引状态为已可用,然后释放索引构建过程中的所有锁。
索引构建过程中的加锁描述细节参见Index Build Process章节。更深入了解MongoDB的加锁行为参见FAQ: Concurrency。
行为
MongoDB 4.2索引构建过程完全替换了之前版本的索引构建过程。MongoDB忽视了createIndexes
命令或其shell中createIndex()
和 createIndexes()
函数的background
选项。(注:MongoDB 4.2中无需在db.collectionName.createIndex()中设置{'background':true})。
需特性兼容版本设置为4.2版本
当MongoDB集群从4.0版本升级到4.2版本时,需设置特性兼容版本选项到4.2版本,以启用该优化过程,参见setFeatureCompatibilityVersion
。
MongoDB 4.2版本在特性兼容版本为4.0时,仅支持4.0的索引构建方式。
索引前后台创建的比较
先前版本的MongoDB支持前后台两种方