Mongodb 创建索引需要很长时间

Mongodb 创建索引需要很长时间,mongodb,Mongodb,我在MongoDB中创建了一个集合,包含11446615文档 每份文件的格式如下: { "_id" : ObjectId("4e03dec7c3c365f574820835"), "httpReferer" : "http://www.somewebsite.pl/art.php?id=13321&b=1", "words" : ["SEX", "DRUGS", "ROCKNROLL", "WHATEVER"], "howMany" : 3 } httpRef

我在MongoDB中创建了一个集合,包含11446615文档

每份文件的格式如下:

{ 
 "_id" : ObjectId("4e03dec7c3c365f574820835"), 
 "httpReferer" : "http://www.somewebsite.pl/art.php?id=13321&b=1", 
 "words" : ["SEX", "DRUGS", "ROCKNROLL", "WHATEVER"],     
 "howMany" : 3 
}
httpReferer:只是一个url

单词:从上面的url解析的单词。列表的大小介于15到90之间

我计划使用此数据库获取具有类似内容的网页列表

我将使用words字段查询此集合,因此我在此字段上创建(或者说开始创建)索引:

db.my_coll.ensureIndex({words: 1})
我大约在3个小时前开始创建索引,但似乎不可能在3个小时内完成


如何提高索引速度?或者我应该完全用另一种方法来解决这个问题?欢迎提出任何想法:)

不,大型收藏的索引速度很慢。您也可以在后台创建索引:

db.my_coll.ensureIndex({words:1},{background:true})


在后台创建索引会变慢,并导致索引变大。但是,在索引完成之前不会使用它,因此在此期间,您可以正常使用数据库,并且索引不会阻塞

背景索引也有一些问题

1) 如果有任何问题,由于服务器上的负载,需要更长的时间。 2) 如果由于某种原因中断,它将作为前台生成重新启动

如果你有一个副本集,我更喜欢做一个“滚动索引构建”。 1.从副本集中取出辅助副本 2.构建索引 3.将次副本插入回副本集中


我认为这是最干净的解决方案。

我刚刚在mongodb.log中检查,为整个集合创建索引大约需要30个小时,这太长了。在添加数据之前,我将尝试创建索引。我尝试了另一种方法。在将数据插入集合之前建立索引。结果更糟。在此之前,插入数据需要5.5小时,索引数据大约需要30小时。将数据添加到预索引集合需要几天时间。在插入之前创建索引会更慢。如果您可以等到数据导入后再创建索引,则会更高效、更快。用于大型集合的碎片可能会有所帮助。如果巨大的集合在两个或多个碎片之间很好地平衡,索引时间将比碎片时间快,因为索引创建将并行运行-为什么在后台创建索引会导致更大的索引?