MongoDB索引构建过程&为什么索引创建会阻止所有数据库活动



我不得不为集合创建索引。我创建了它,但它影响了其他数据库中其他集合的所有请求。

从doc中,我读到索引创建阻塞了所有数据库上的所有读/写锁。mongo DB的这种行为背后的原因是什么?

  • 锁定该集合是最好的
  • 锁定该数据库是可以接受的
  • 锁定所有数据库让我很困惑

在MongoDB-上构建索引有两种方法

1(前景:如果您使用的是MongoDB版本<4.2所有索引默认为构建Foreground,它具有更好的数据结构&进程很快,但主要的缺点是当索引构建时,它会阻塞数据库上的所有操作。在通常的生产服务器上必须避免这种情况。

2(背景:因此,对于4.2以下的所有版本,为了克服前台构建过程中阻塞数据库活动的问题,可以选择{background :true}在后台构建索引,而MongoDB正在构建索引,您仍然可以进行读取&写入,但这种方法的缺点是索引结构的性能最低&索引生成时间更长。

对于MongoDB v>=4.2,不赞成在后台构建索引,因此您不能再指定它&利用后台索引,所以MongoDB本身以后台方式在内部构建索引,但在索引构建开始时会锁定特定的集合&在构建结束时,大部分时间都要休息——你可以继续阅读了;写入,但不知何故会有"意图独占IX锁",它会间歇性地锁定集合&在某些阶段之后,将锁定写入&然后是一个完整的锁,最后会被释放但为什么所以这是为了利用牢度&更好的前台数据结构+后台构建过程的非锁定机制。

引用:.createIndex((&索引创建过程

最新更新