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

问题描述 投票:0回答:1

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

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

  • 锁定该收藏是最好的。
  • 锁定该数据库是可以接受的。
  • 锁定所有数据库让我很困惑。
mongodb indexing mongodb-query mongodb-indexes
1个回答
6
投票

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

1) 前台:如果您使用的是 MongoDB 版本 <

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

2) 背景:因此,对于

4.2
以下的所有版本,为了克服前台构建过程阻塞数据库活动的缺点,有一个选项
{background :true}
可以在后台构建索引,当 MongoDB 正在构建索引时,您仍然可以这样做读取和写入,但这种方法的缺点是索引结构性能最低且索引构建时间更长。

对于 MongoDB v >=

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

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

© www.soinside.com 2019 - 2024. All rights reserved.