我们应该在mongodb中执行批量插入操作吗??这会阻止其他读/写操作吗?
我将mongodb用于我们的应用程序 我们有一个非常高的mongodb使用率,你会知道看到这个mongostat输出我们应该在mongodb中执行批量插入操作吗??这会阻止其他读/写操作吗?,mongodb,Mongodb,我将mongodb用于我们的应用程序 我们有一个非常高的mongodb使用率,你会知道看到这个mongostat输出 insert/s query/s update/s delete/s getmore/s command/s flushes/s mapped vsize res faults/s locked % idx miss % q t|r|w conn time 0 4 1 0 0
insert/s query/s update/s delete/s getmore/s command/s flushes/s mapped vsize res faults/s locked % idx miss % q t|r|w conn time
0 4 1 0 0 3 1 10396 11347 591 0 0.1 0 0|0|0 70 10:57:28
0 65 31 0 0 35 0 10396 11347 591 1 3.7 0 0|0|0 70 10:57:29
0 76 37 0 0 41 0 10396 11347 591 0 3.5 0 0|0|0 70 10:57:30
0 85 42 0 0 44 0 10396 11347 591 1 4.7 0 0|0|0 70 10:57:33
0 52 25 0 0 29 0 10396 11347 591 0 2.9 0 0|0|0 70 10:57:34
0 26 11 0 0 15 0 10396 11347 591 0 1.1 0 0|0|0 70 10:57:36
0 83 41 0 0 43 0 10396 11347 591 1 4.6 0 0|0|0 69 10:57:37
关于我的问题,
根据我们的应用程序,当用户登录应用程序时,我需要存储用户持有的任何符号。
(用户可能包含20到100范围内的符号)
实现上述插入操作的最佳方法是什么
1. Perform a insert operation for each symbol individually
Or
2. Insert all the symbols at once this way
public void insert(ArrayList<QuoteReportBean> quotelist) {
DBObject[] totalrecords = new BasicDBObject[quotelist.size()];
for (int i = 0; i < quotelist.size(); i++) {
QuoteReportBean reportbean = quotelist.get(i);
BasicDBObject dbrecord = new BasicDBObject();
dbrecord.append("cust", reportbean.getCustomerId());
dbrecord.append("symbol", reportbean.getUniqueSymbol());
dbrecord.append("access_time", reportbean.getDate());
totalrecords[i] = dbrecord;
}
WriteResult result = coll.insert(totalrecords,WriteConcern.NORMAL);
logger.info("quotelist" + result.toString());
}
第二种方法的插入查询已记录在system.profile集合中
您能告诉我插入操作是否会锁定其他读/写操作吗?将多个对象以数组形式发送到数据库比为每个对象单独插入要快得多。它可以快一个数量级,这取决于阵列大小和对象的大小 您可能会看到第二条语句(批处理/数组插入)被记录为“慢速查询”的原因是,它比单个插入花费的时间更长,但肯定比所有单个插入加在一起要快
最后,您的
mongostat
输出看起来并不特别引人注目。MongoDB每秒可以轻松执行数千次操作(当然这取决于操作),因此至少根据屏幕截图,您不会接近极限。在一个数组中向数据库发送多个对象要比为每个对象单独插入快得多。它可以快一个数量级,这取决于阵列大小和对象的大小
您可能会看到第二条语句(批处理/数组插入)被记录为“慢速查询”的原因是,它比单个插入花费的时间更长,但肯定比所有单个插入加在一起要快
最后,您的
mongostat
输出看起来并不特别引人注目。MongoDB每秒可以轻松执行数千次操作(当然这取决于操作),因此至少根据屏幕截图,您还没有接近极限。只回答最后一行查询:MongoDB中的每个写操作都会阻止其他读/写操作。这是因为每个数据库只有一个写锁。但是写操作非常快,因此您将获得良好的吞吐量。但是读取可以是并行的。忽略了第一个问题:mongodb中的批插入非常快,但它不会为所有失败的写入报告错误。只报告最后一次写入失败。您是否阅读了MongoDB的锁定常见问题解答?仅回答您的最后一行查询:mongodb中的每个写操作都将阻止其他读/写操作。这是因为每个数据库只有一个写锁。但是写操作非常快,因此您将获得良好的吞吐量。但是读取可以是并行的。忽略了第一个问题:mongodb中的批插入非常快,但它不会为所有失败的写入报告错误。只报告最后一次写入失败。您是否阅读了MongoDB的锁定常见问题解答?您是对的,对数据库进行10次顺序写入要比一次10次的批写入慢。但是,您也可以启动10个线程,并对数据库进行10次并行写入。这会比批量API更快吗?我不确定。我认为批处理操作可以采用单个写锁,并以某种方式在DB端并行化写操作,但确实如此?@skelly Bulk Insert通过减少RTT节省了大量资源。通过大容量插入,10个线程仍然需要10个RTT而不是一个RTT。您是对的,对db进行10次顺序写入要比一次10次的批写入慢。但是,您也可以启动10个线程,并对数据库进行10次并行写入。这会比批量API更快吗?我不确定。我认为批处理操作可以采用单个写锁,并以某种方式在DB端并行化写操作,但确实如此?@skelly Bulk Insert通过减少RTT节省了大量资源。通过批量插入,10个线程仍然需要10个RTT,而不是一个RTT。
db.setProfilingLevel(1,50)