由於不進入資料庫,本文並不能代表mongodb效能,僅以此與IO做簡單對比得出效能並不科學,但也能從側面說明一定問題,給大家開發中一定的提示。
附: 本文測試並作於2012年初,由於錄入部落格時間較晚,可能有所差異,歡迎提供最新資料。
測試資料大小:531M
讀取資料大小:10^7 位元組
由於MongoDB最快的記憶體檔案讀寫方式大致如下(不進入資料庫):
read(unsigned int nOffset , void *lpStore , unsigned int nStoreLen ),其每次讀已預設進行了類似seek的位移,因此,測試時使用seek 與沒有 seek 的 同時進行測試,結果如下(單位:ms):
每次讀1位元組,共讀10^7次,(seek對應10^7次)
without Seek |
Seek |
MongoDB |
265 |
5678 |
3885 |
281 |
5601 |
3916 |
265 |
5612 |
3791 |
272 |
5726 |
3842 |
264 |
5709 |
3850 |
280 |
5702 |
3872 |
265 |
5600 |
3940 |
266 |
5631 |
3912 |
每次讀取10 位元組 ,共讀 10^6次:
without Seek |
Seek |
MongoDB |
31 |
608 |
390 |
31 |
562 |
406 |
31 |
577 |
390 |
47 |
577 |
390 |
16 |
577 |
375 |
31 |
577 |
390 |
31 |
562 |
422 |
31 |
577 |
390 |
31 |
562 |
390 |
讀取10^7 BYTE 對於讀取大記憶體塊,兩者效能幾乎接近。
總結: 在測試中MongoDB對於連續性讀取效能約僅為IO的1/10左右,但是相對每次進行位移後取值存在較大優勢(例如移動滑鼠擷取映像值,如下圖),對於讀取大記憶體,MongoDB效能與IO相差微乎其微。因此,顆粒度越大,MongoDB效能就越接近IO,如果將MongoDB作為底層,需要避免頻繁小顆粒度的存取(零存整取)。
本文僅以簡單方式測試了MongoDB不進入資料庫下read,並不能代表MongoDB本身效能,只能說明如何更好的去應用它。