2012年11月8日 星期四

提昇 MongoDB 的讀取效能

在我們專案裡面有個 MongoDB 的資料庫,在測試時發現裡面的 19 萬筆資料全倒出來時
花費的時間相當可觀,平均大約是 10~15 秒左右!
但 19 萬筆資料並不算是很龐大的資料,理論上不應該出現這種結果
因此花了些時間查詢有沒有方法可以提昇效率~。

邊查邊測了大概兩天,其實沒查到什麼方法
倒是有發現如果直接在 MongoDB 的 shell 上面輸入同樣的語法時,shell 只要花不到 3 秒就可以取完所有的 document。

後來是有發現一種方法可以提昇效率,即利用多執行緒的方法加速
因為 MongoDB 的 Lock 基本上是 Write-Lock,讀取時並不會把整個資料庫上鎖
因此是有可能可以同時開 N 個連線,分別向 MongoDB 取得不同的資料。
利用這個特性,我設計了一個小程式去測試那 19 萬筆資料的取得狀況
平均來說用單執行緒的時候,讀取所有的 19 萬筆資料,花費的時間約是 13.181 秒(標準差 4.708 秒)
而同時開 20 個執行緒,第一個執行緒取 #0~#19000、第二個執行緒取 #19001~#38000、以此類推
這樣讀取完所有的 19 萬筆資料、並且把資料合併的所需時間約是 6.076 秒(標準差 2.033 秒)
同時開 50 個執行緒時,時間則是 4.995 秒(標準差 1.775 秒)
結果是還蠻訝異的,改用多執行緒時速度明顯加快至少一倍!
不過什麼狀況要開幾個執行緒,資源和速度才能取得合理的平衡?這是個需要多花時間測試的問題了~
而且目前我還是不覺得區區 19 萬筆會需要讓 MongoDB 花這麼多時間....。
之後有時間再來研究看看還有沒有別的可能。

沒有留言: