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

Gib*_*bbs 2 indexing mongodb mongodb-query mongodb-indexes

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

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

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

sri*_*asy 7

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

1)前台:如果您使用的是 MongoDB 版本 <4.2所有索引默认都会构建前台,它具有更好的数据结构且处理速度更快,但主要缺点是索引构建时会阻止数据库上的所有操作。在通常的产品服务器上必须避免这种情况。

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

对于 MongoDB v >= 4.2,不推荐在后台构建索引,因此您不能再指定它并利用后台索引,因此 MongoDB 本身以后台方式内部构建索引,但在索引开始时会锁定特定集合构建并在构建结束时,大部分时间分开,您可以继续进行读取和写入,但不知何故,将会出现“意向独占 IX 锁”,它将间歇性地锁定集合,并且在某些阶段之后,将会出现写入锁定,然后一个完整的锁,最后会被释放。但为什么 ?所以这是为了利用前台的快速性和更好的数据结构+后台构建过程的非锁定机制。

参考: .createIndex()索引创建过程