1

我将 mongodb 用于我们的 Application 。

我们对 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集合中

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

4

1 回答 1

1

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

您可能会看到您的第二条语句(批处理/数组插入)记录为“慢查询”的原因是因为它比单个插入花费的时间更长,但它肯定会比所有单个插入一起更快。

最后,您的mongostat输出看起来并不特别引人注目。MongoDB 可以轻松地每秒执行几千次操作(当然取决于操作),因此至少根据该屏幕截图,您并没有接近极限。

于 2013-08-28T19:02:55.553 回答