MongoDB中四字段索引创建缓慢

MongoDB中四字段索引创建缓慢,mongodb,Mongodb,我在MongoDB中有一个ProductRequest集合。这是一个有点大的收藏,但不是那么多的文件。文档数量略多于300000,但文档的平均大小接近1MB,因此数据占用空间很大 为了加快某些查询,我正在为此集合设置索引: db.ProductRequest.ensureIndex ({processed: 1, parsed: 1, error:1,processDate:1}) 前三个字段是布尔值,最后一个是日期时间 该命令将运行24小时,不会返回 我已经在“已处理”和“已解析”字段上建立

我在MongoDB中有一个ProductRequest集合。这是一个有点大的收藏,但不是那么多的文件。文档数量略多于300000,但文档的平均大小接近1MB,因此数据占用空间很大

为了加快某些查询,我正在为此集合设置索引:

db.ProductRequest.ensureIndex ({processed: 1, parsed: 1, error:1,processDate:1})
前三个字段是布尔值,最后一个是日期时间

该命令将运行24小时,不会返回

我已经在“已处理”和“已解析”字段上建立了索引,在“错误”字段上建立了单独的索引。为什么创建这四个字段索引要花很长时间?我的理解是,在这种情况下,个人记录的大小并不重要,我错了吗

其他信息:

MongoDB版本2.6.1 64位

主机操作系统Centos 6.5

分片:是的,分片键是_id。分片数:2,每个分片中的副本集数是3。

我相信这是因为为布尔字段设置了索引。
由于只有两个值true或false,如果有300.000行在该字段上放置索引,则必须扫描150.00行以查找所有文档,在您的情况下,有3个布尔字段,与仅在processDate上的索引相比,在这三个字段和processDate上的索引不会带来很大的好处。布尔字段上的索引在存在其他可索引字段时不是很有用,因为它们不是很有选择性。如果您给出一个处理日期,那么只有8种可能性可以通过索引组合其他字段来进一步缩小结果范围

另外,您应该切换顺序。将processDate放在第一位,因为它比布尔字段更有选择性。这将大大简化索引并加快索引的构建

最后,MongoDB中的索引创建有时不可避免地缓慢且昂贵,因为它涉及到创建大型B树。当然,回报是更快的查询,这绝对值得。建立索引可能需要超过24小时。你检查过饱和资源是什么吗?它可能是索引构建的CPU。对于这种情况,最好的选择是创建索引。背景索引构建

不要像前台索引构建那样在持续时间内阻止读写操作 需要更长时间 生成最初较大的索引,随着时间的推移,这些索引将收敛到相当于前景索引的大小 您可以使用ensureIndex调用的额外选项将索引生成设置为在后台进行:


你确定你的终端连接没有消失吗?您是否尝试检查索引是否存在于第二个mongo客户端中?
db.myCollection.ensureIndex({ "myField" : 1 }, { "background" : 1 })