如何加速Mongodb的插入操作?

3

我正在尝试使用mongodb(Java编码)创建一个大数据应用程序。我的集合由普通文本文档组成。由于我不想要重复项,而且文档的文本字段太大了,无法创建唯一索引,因此我决定为每个文档的文本计算校验和值(使用MD5的MessageDigest),将该字段保存在文档中,并在该字段上创建唯一索引。

大致上,我的文档结构如下:

{
"_id": ObjectId('5336b4942c1a99c94275e1e6')
"textval": "some long text"
"checksum": "444066ed458746374238266cb9dcd20c"
"some_other_field": "qwertyuıop"
}

当我向我的集合添加新文档时,首先尝试通过查找具有该校验和值的文档来查看其是否存在。如果存在,则更新(其他字段),否则插入新文档。

这种策略很有效!但是,在集合中添加了一百万个文档后,我开始遇到无法接受的插入持续时间。校验和查找和插入都变慢了。我可以在将近1小时内插入约30,000个文档!我已经阅读了关于批量插入的文章,但是如果我采用这种方式,该怎么处理重复记录呢?请问有什么建议可以加速操作吗?


1
你在checksumupdate_time上有一个复合索引,并且正在尝试使用upsert选项进行更新吗? - Anand Jayabalan
抱歉,我之前提供的信息是错误的。没有update_time查询,只有checksum。我已经更正了问题。但是在"textval"上有索引,这可能是导致缓慢的原因吗? - salihcenap
1个回答

1

我认为,如果您使用另一个仅包含校验和和更新时间字段的集合,速度会更快。当您插入普通的JSON文档时,您应该同时插入这个短的JSON文档:

Your normal JSON document:
{
"_id": ObjectId('5336b4942c1a99c94275e1e6')
"textval": "some long text"
"checksum": "444066ed458746374238266cb9dcd20c"
"update_time": new Date(1396220136948)
"some_other_field": "qwertyuıop"
}

The short JSON document:
{
"_id": ...
"checksum": "444066ed458746374238266cb9dcd20c"
"update_time": new Date(1396220136948)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接