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

NO IMAGE

    Mongodb操作裡許多人喜歡採用PHP的迴圈操作,這種方式效率非常低下,可以優化。
1、 查詢:
    有兩種方式,在PHP裡迴圈查詢和使用$in的方式。做一個查詢1000條資料的示例如下:

// 迴圈查詢
for($i = 0; $i < count($array); $i  ) {
$item = $collection -> findOne(array("_id" => new MongoId($array[$i])));
echo $item["profile"]["name"] . "<br />";
}

    執行時間:0.52035784721375秒

// 採用$in的方式
$mongoIds = array();
for($i = 0; $i < count($array); $i  ) {
$mongoIds[] = new MongoId($array[$i]);
}
$cursor = $collection -> find(array("_id" => array('$in' => $mongoIds)));
while($item = $cursor-> getNext()){
echo $item["profile"]["name"] . "<br />";
}

    執行時間:0.15661716461182秒
    結果採用迴圈方式的執行時間為$in方式的3倍以上。
2、 更新:
    還是兩種方式,在PHP裡迴圈更新和使用$in的方式。做一個查詢1321條資料的示例如下:

// 迴圈更新(目前刪除blog時採用的方式)
foreach ($fans as $fan)
{
$feed = $db -> command(array("findAndModify" => $MONGO_DB_FEED,
"query" => array('_id' => new MongoId($fan)),
"update" => array('$pull' => array("blogs"=>array("bid" => $blog_id)), '$inc' => array("count"=>-1)),
"new" => true
)
);
}

    執行時間:28.02441906929秒

// 採用$in的方式
$mongoIds = array();
foreach ($fans as $fan) {
$mongoIds[] = new MongoId($fan);
}
$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操作可以進行查詢優化,也不需要多次編譯。