我们应该在mongodb中进行批量插入操作吗?这将阻止其他读/写操作吗?

时间:2013-08-28 15:20:37

标签: 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         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());
    }

我担心的是,我将分析级别设置为50

 db.setProfilingLevel(1,50)

并且第二种方法的插入查询已记录在system.profile集合

您能否告诉我插入操作是否可能锁定其他读/写操作?

1 个答案:

答案 0 :(得分:1)

将多个对象发送到数组中的数据库要比为每个对象执行单独的插入要快得多。它可以快一个数量级,具体取决于数组大小和对象的大小。

你可能会看到你的第二个语句(批量/数组插入)被记录为“慢速查询”的原因是因为它需要比单个插入更长的时间,但它肯定会比所有单个插入更快。

最后,您的mongostat输出看起来并不特别引人注目。 MongoDB每秒可以很容易地进行几千次操作(当然取决于操作),所以你不会接近达到极限,至少根据截图来说。