为什么创建索引时Mongo查询会挂起很长时间?

ang*_*okh 5 mongodb mongodb-3.2

我们正在通过分片将单个 Mongo 实例迁移到 Mongo 集群。我还没有开始分片。但是,我发现当我尝试添加索引时,我无法再查询任何集合。我们当前的 Mongo 实例中没有这个问题。在我们当前的 Mongo 中,我们可以同时应用索引和查询集合。

这是我在新集群上创建索引时运行的命令:

mongos> db.lc_data.ensureIndex({"name": 1})
Run Code Online (Sandbox Code Playgroud)

现在,我打开另一个终端并查询同一数据库中的集合或其他集合。

mongos> db.lc_other.find()
Run Code Online (Sandbox Code Playgroud)

查询将挂起!为什么会出现这种情况?

Ste*_*nie 5

在 MongoDB 3.2 中,这是前台索引构建的预期行为:

默认情况下,创建索引会阻止数据库上的所有其他操作。在集合上构建索引时,在索引构建完成之前,保存该集合的数据库不可用于读取或写入操作。任何需要对所有数据库(例如listDatabases)进行读或写锁定的操作都将等待前台索引构建完成。

为了避免在具有重要现有数据的集合上构建新索引时出现这种行为,您应该在后台构建索引:

mongos> db.lc_data.ensureIndex({"name": 1}, {background:true})
Run Code Online (Sandbox Code Playgroud)

MongoDB 2.4+ 可以在后台构建多个索引。有关更多信息,请参阅:背景索引构建

您可能还希望投票/观看SERVER-20960: MongoDB 问题跟踪器中的配置/运行时中的默认索引构建选项支持,这是一个使默认索引构建类型可配置的功能请求(例如,默认为后台索引构建)。