Mongodb操作裡許多人喜歡採用PHP的迴圈操作,這種方式效率非常低下,可以最佳化。
1、查詢:
有兩種方式,在PHP裡迴圈查詢和使用$in的方式。做一個查詢1000條資料的樣本如下:
// 迴圈查詢<br />for($i = 0; $i < count($array); $i++) {<br /> $item = $collection -> findOne(array("_id" => new MongoId($array[$i])));<br /> echo $item["profile"]["name"] . "<br />";<br />}
已耗用時間:0.52035784721375秒
// 採用$in的方式<br />$mongoIds = array();<br />for($i = 0; $i < count($array); $i++) {<br /> $mongoIds[] = new MongoId($array[$i]);<br />}<br />$cursor = $collection -> find(array("_id" => array('$in' => $mongoIds)));<br />while($item = $cursor-> getNext()){<br /> echo $item["profile"]["name"] . "<br />";<br />}
已耗用時間:0.15661716461182秒
結果採用迴圈方式的已耗用時間為$in方式的3倍以上。
2、更新:
還是兩種方式,在PHP裡迴圈更新和使用$in的方式。做一個查詢1321條資料的樣本如下:
// 迴圈更新(目前刪除blog時採用的方式)<br />foreach ($fans as $fan)<br />{<br /> $feed = $db -> command(array("findAndModify" => $MONGO_DB_FEED,<br /> "query" => array('_id' => new MongoId($fan)),<br /> "update" => array('$pull' => array("blogs"=>array("bid" => $blog_id)), '$inc' => array("count"=>-1)),<br /> "new" => true<br /> )<br /> );<br />} 已耗用時間:28.02441906929秒
// 採用$in的方式<br />$mongoIds = array();<br />foreach ($fans as $fan) {<br /> $mongoIds[] = new MongoId($fan);<br />}<br />$feed -> update(array('_id' => array('$in' => $mongoIds)), array('$pull' => array("blogs"=>array("bid" => $blog_id)), '$inc' => array("count" => -1)), array('multiple' => true)); 已耗用時間:0.011945962905884秒
結果採用迴圈方式的已耗用時間為$in方式的2335倍!
第一種方式非常容易出現啟動並執行逾時的情況造成操作不成功,而第二種方式在提高效率的同時避免了這種問題的出現。
造成這樣問題的原因是1、迴圈裡的網路請求時間消耗太多時間2、$in操作可以進行查詢最佳化,也不需要多次編譯。