MongoDB for node.js developers 七周学习-最终测试小结(2)

还剩下一半:6、添加优化 7、游标 8、副本 9、片键 10、explain方法

6、添加优化

怎么加快insert的速度呢?

可以清除掉所有的index,因为有index再插入后MongoDB要维持index需要额外的开销

db.collection.dropIndex(index)   //index TYPE string or document

 

也可以修改写入关注(write concern),默认是W: 1,J: 0。

 

db.messages.insert({_id: 1});                                            //先插入一个id为1的文档
WriteResult({ "nInserted" : 1 })
db.messages.insert({_id: 1},{ writeConcern: { w: 1 }});                  //默认设置下w=1,所以其实跟上面一个命令一个意思,但不能有id一样的文档,所以返回错误信息
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error index: enron.messages.$_id_ dup key: { : 1.0 }"
        }
})
db.messages.insert({_id: 1},{ writeConcern: { w: 0 }});                 //把w设为0,也就是不等待写入返回结果,所以返回的是个空。
WriteResult({ });

 因为减少了等待时间,因此写入的速度也加快了,不过这是以降低安全性为代价的。

 

7、游标

游标本身提供了很多方法。

Cursor methods
  .toArray() - iterates through docs and returns an array of the results
  .forEach( func )
  .map( func )
  .hasNext()
  .next()
  .objsLeftInBatch() - returns count of docs left in current batch (when exhausted, a new getMore will be issued)
  .itcount() - iterates through documents and counts them
  .getQueryPlan() - get query plans associated with shape. To get more info on query plans, call getQueryPlan().help().
  .pretty() - pretty print each document, possibly over multiple lines

我们可以结合.hasNext()与.next()进行迭代。

var myCursor = db.inventory.find( { type: 'food' } );

while (myCursor.hasNext()) {
   print(tojson(myCursor.next()));
}

 

8、副本(replication)

副本是为了是数据更有可用性(availability),有一个主服务器处理客户端的请求,有多个备份服务器用于保存主服务器的数据副本。当主服务器崩溃后,备份服务器会自动选举一个成为主服务器。

当主服务器崩溃时,有些数据还来不及同步到备份服务器上,当这台服务器恢复后会比较现在主服务器的操作日志,然后进行回滚,将崩溃之前未复制的操作撤销,然后才能进行同步。

 

9、片键

分片是为了提供更大的负载,将原本的数据拆分到多个服务器上的方式。

片键则是将请求映射到服务器的关系,类似索引概念。

片键选择的时候要尽量避免大量的数据处理集中到一个服务器上,像以"_id"作为片键时,插入新的数据都会在最后一个服务器上,造成局部过热,这违背我们希望分散处理的初衷。

 

10、explain方法

syntax:db.collection.find().explain()  or  db.collection.explain() .find()

提供三种模式: "queryPlanner","executionStats", and "allPlansExecution"。信息提供是递进式的,也就是后面提供的更多。

{
   "queryPlanner" : {
      "plannerVersion" : <int>,
      "namespace" : <string>,
      "indexFilterSet" : <boolean>,
      "parsedQuery" : {
         ...
      },
      "winningPlan" : {
         "stage" : <STAGE1>,
         ...
         "inputStage" : {
            "stage" : <STAGE2>,
            ...
            "inputStage" : {
               ...
            }
         }
      },
      "rejectedPlans" : [
         <candidate plan 1>,
         ...
      ]
   }

 

posted @ 2015-07-27 14:40  ChenRJ  阅读(239)  评论(0编辑  收藏  举报