Mongodb 创建索引需要很长时间
我在MongoDB中创建了一个集合,包含11446615文档 每份文件的格式如下: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
{
"_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小时。将数据添加到预索引集合需要几天时间。在插入之前创建索引会更慢。如果您可以等到数据导入后再创建索引,则会更高效、更快。用于大型集合的碎片可能会有所帮助。如果巨大的集合在两个或多个碎片之间很好地平衡,索引时间将比碎片时间快,因为索引创建将并行运行-为什么在后台创建索引会导致更大的索引?