Java 大量插入大型MongoDB集合的性能较慢
我有JSON格式的数据,其中包含数百万条我想插入MongoDB数据库的记录。我创建了一个JAVA程序,该程序读取JSON文件,对其进行解析,并使用Java 大量插入大型MongoDB集合的性能较慢,java,mongodb,performance,insert,Java,Mongodb,Performance,Insert,我有JSON格式的数据,其中包含数百万条我想插入MongoDB数据库的记录。我创建了一个JAVA程序,该程序读取JSON文件,对其进行解析,并使用insertMany()方法将其批量插入MongoDB集合。每个批量插入包含10000个文档。文档的平均大小为13KB。在向集合中插入大约30万个文档后,插入的性能开始逐渐降低。除了MongoDB提供的默认索引外,集合上没有其他索引 我已经查看了mongod.log来诊断问题,在集合包含大约300000个文档之后,每一次大容量插入都会导致在整个集合上使
insertMany()
方法将其批量插入MongoDB集合。每个批量插入包含10000个文档。文档的平均大小为13KB。在向集合中插入大约30万个文档后,插入的性能开始逐渐降低。除了MongoDB提供的默认索引外,集合上没有其他索引
我已经查看了mongod.log来诊断问题,在集合包含大约300000个文档之后,每一次大容量插入都会导致在整个集合上使用COLLSCAN执行聚合命令。在收集了300000份文档后,扫描过程大约需要30秒。大容量插入操作本身的时间不会改变,平均为200毫秒/10000个文档
MongoDB的完整日志文件可在此处找到:
下面的JSON输出是在从mongod.log文件提取每次插入后执行的聚合命令的示例。在这里,扫描时间超过6秒
我能做些什么来避免每次批量插入后的收集扫描
I COMMAND [conn2] command diploma.patent command: aggregate {
aggregate: "patent",
pipeline: [
{ $match: {}
},
{ $group: {
_id: null,
n: { $sum: 1
}
}
}
], cursor: {},
$db: "diploma",
$readPreference: { mode: "primaryPreferred" }
}
planSummary: COLLSCAN
keysExamined: 0
docsExamined: 2453599
cursorExhausted: 1
numYields: 19422
nreturned: 1
reslen: 123
locks: {
Global: {
acquireCount: {
r: 19424
}
},
Database: {
acquireCount: {
r: 19424
}
},
Collection: {
acquireCount: {
r: 19424
}
}
} protocol:op_msg 6274ms
你在使用什么mongo连接器?我没有使用mongo连接器,只有MongoDB Java驱动程序。你真的没有在代码中使用任何聚合吗?不确定它为什么执行此聚合。。。看起来这个聚合对所有对象都进行了简单的计数,但没有接近优化的地方,因为$group不处理索引afaik。哦,你是对的。我正在调用
countDocuments()
,但没有意识到这是一个性能非常高的操作。非常感谢。