MongoDB中的MapReduce至關於Mysql中的group by, 因此在MongoDb上使用Map/Reduce進行並行"統計"比較容易。使用MapReduce要實現兩個函數Map和Reduce函數,Map函數調用emit(key, value),遍歷collection中全部記錄,將key與value傳遞給Reduce函數進行處理。Map函數和Reduce函數可使用javascript來實現。能夠經過db.runCommand()或mapReduce()命令來執行MapReduce操做。javascript
下列是runCommand()函數與參數說明php
db.runCommand( 'mapreduce':<collectoin>,//要操做的目標集合 'map':<mapfunc>,//映射函數(生成鍵值對序列,作爲reduce函數參考) 'reduce':<reducefunc>//統計函數 [,query:<query filter object>]//目標記錄過濾 [,sort:<>]//目標記錄排序 [,limit:<number of objects to return form collection>]//限制目標記錄數量 [,out:<see output options below>]//統計結果存放集合(不指定則使用臨時集合,在客戶端斷開後自動刪除) [,keeptem:<true|false>]//是否保留臨時集合 [,finalize:<finalizeFunc>]//最終處理函數(對reduce返回結果進行最終整理後存入結果集合) [,scope:<object where fields go into javascript global scope>]//向map/reduce/finalize導入外部變量。 [,verbose:true]//顯示詳細的時間統計信息 );
咱們先準備一些數據(用php腳本暫時insert十萬數據,大概須要8.35秒):
java
ini__set('max_execution_time', 300)是適應瀏覽器執行時,出現的30秒超時。
接下來,咱們利用php來統計uid。(10萬條數據,大概耗時7.29秒)
sql
這個腳本大概運行7~8秒鐘,咱們利用MongoCode()創建Map和Reduce函數,而後經過out選擇創建臨時表,在這有咱們留下臨時表,不作刪除。
生成表的數據格式有兩個元素,一個uid爲_id、另外一個是這個uid出現的次數,存在value。
咱們再次用insert腳本插入90萬數據,弄成100萬的數據。此次耗時是1.7min。因而可知,這並非成線性增加,而是隨着數據量增加,時間也在不斷的遞增,並且單位時間內增加的數據量也會減小。segmentfault
好,那咱們再次執行map腳本,看看須要多長時間。此次大概耗時1分鐘20秒左右。瀏覽器
可是若是咱們用日常的方法,利用循環、判斷、組合來分組的話,耗時已經不單單爲1分鐘了,時間會更長。函數
因此,在合適的時候用MapReduce會事半功倍的。這只是處理100萬的數據,可是若是處理更多的數據時,上千萬的數據,也會更節省時間,固然隨着數據量的增多,須要注意更多方面的問題,譬如內存是否足夠等等。ui