由于不进入数据库,本文并不能代表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本身性能,只能说明如何更好的去应用它。