创建索引需要很长时间

时间:2011-06-24 10:49:36

标签: mongodb

我在MongoDB中创建了一个由 11446615 文档组成的集合。

每份文件都有以下形式:

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

httpReferer :只是一个网址

单词:从上面的网址解析的单词。列表的大小在15到90之间。

我打算使用此数据库来获取具有类似内容的网页列表。

我将使用单词字段查询此集合,以便在此字段中创建(或者更确切地说是创建)索引:

db.my_coll.ensureIndex({words: 1})

我在3个小时前开始制作索引,看起来好像它还能在3个小时内完成。

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

3 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:3)

背景索引也存在一些问题。

1)如果由于服务器上的负载而需要更长的时间。 2)如果由于某种原因中断,它将作为前台构建重新启动

如果你有一个副本集,我更喜欢做一个"滚动索引构建"。 1.从副本集中取出二级副本 2.建立索引 3.将辅助插入到副本集

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

答案 2 :(得分:-3)

我们遇到了大量收集(大约1.5亿个对象)的问题。首先我们插入数据,然后我们创建了具有时间估计的索引 - 整个集合的20小时。这听起来不太好......

因此,我们找到了提高性能的解决方案 - 使用fork运行mongo。 https://docs.mongodb.com/manual/tutorial/manage-mongodb-processes/#start-mongod-as-a-daemon

$ mongod --fork ...

我们的索引创建时间接近1.5小时。