发表于 2015-7-9 12:23:06

Mongodb采用$in方式提升操作效率

Mongodb操作里许多人喜欢采用PHP的循环操作,这种方式效率非常低下,可以优化。
1、查询:
    有两种方式,在PHP里循环查询和使用$in的方式。做一个查询1000条数据的示例如下:
// 循环查询for($i = 0; $i < count($array); $i++) {$item = $collection -> findOne(array(&quot;_id&quot; => new MongoId($array[$i])));echo $item[&quot;profile&quot;][&quot;name&quot;] . &quot;&quot;;}  运行时间:0.52035784721375秒
  // 采用$in的方式$mongoIds = array();for($i = 0; $i < count($array); $i++) {$mongoIds[] = new MongoId($array[$i]);}$cursor = $collection -> find(array(&quot;_id&quot; => array('$in' => $mongoIds)));while($item = $cursor-> getNext()){echo $item[&quot;profile&quot;][&quot;name&quot;] . &quot;&quot;;}
    运行时间:0.15661716461182秒
    结果采用循环方式的运行时间为$in方式的3倍以上。
2、更新:
    还是两种方式,在PHP里循环更新和使用$in的方式。做一个查询1321条数据的示例如下:
// 循环更新(目前删除blog时采用的方式)foreach ($fans as $fan){$feed = $db -> command(array(&quot;findAndModify&quot; => $MONGO_DB_FEED,&quot;query&quot; => array('_id' => new MongoId($fan)),&quot;update&quot; => array('$pull' => array(&quot;blogs&quot;=>array(&quot;bid&quot; => $blog_id)), '$inc' => array(&quot;count&quot;=>-1)),&quot;new&quot; => true));}    运行时间:28.02441906929秒
// 采用$in的方式$mongoIds = array();foreach ($fans as $fan) {$mongoIds[] = new MongoId($fan);}$feed -> update(array('_id' => array('$in' => $mongoIds)), array('$pull' => array(&quot;blogs&quot;=>array(&quot;bid&quot; => $blog_id)), '$inc' => array(&quot;count&quot; => -1)), array('multiple' => true));    运行时间:0.011945962905884秒
    结果采用循环方式的运行时间为$in方式的2335倍!
    第一种方式非常容易出现运行的超时的情况造成操作不成功,而第二种方式在提高效率的同时避免了这种问题的出现。
    造成这样问题的原因是1、循环里的网络请求时间消耗太多时间2、$in操作可以进行查询优化,也不需要多次编译。
页: [1]
查看完整版本: Mongodb采用$in方式提升操作效率