mongodb研究(mongodb 內存數據庫)


本日志大部分都不是原創的轉載復制的會帶鏈接保持版權

工作中使用mongodb已經好久了,諷刺的是到了最后快離職的時候才有時間好好研究下源碼。
 
印象:mongodb是一個內存數據庫,數據都是放到內存里面的,所以速度上不比redis慢。
 
想法:
mongodb對數據的操作大部分都在內存中。但mongodb並不是單純的內存數據庫。甚至個人認為不屬於內存數據庫。
相反,redis就是一個不折不扣的內存數據庫了,mysql一個不折不扣的硬盤數據庫。我們對比下。
 
持久化方式:
redis所有數據都是放在內存中的,持久化是使用RDB方式或者aof方式。( http://blog.nosqlfan.com/html/3813.html
 
 
mongodb的所有數據實際上是存放在硬盤的,所有要操作的數據通過mmap的方式映射到內存某個區域內。
然后,mongodb就在這塊區域里面進行數據修改,避免了零碎的硬盤操作。
至於mmap上的內容flush到硬盤就是操作系統的事情了,所以,如果,mongodb在內存中修改了數據,然后,mmap數據flush到硬盤之前,系統當機了,就會丟失數據了。
 
mysql,無論數據還是索引都存放在硬盤中。到要使用的時候才交換到內存中。能夠處理遠超過內存總量的數據。
 
數據量和性能
當物理內存夠用的時候,redis》mongodb》mysql
 
mysql墊底是肯定的。至於,redis為什么比mongodb快。還是跟場景和使用業務有關系的。
大部分情景下,由於mongodb要兼顧它特有的弱表結構下復雜的查詢,在很多存取過程上做了妥協。
其實,這里並不想說redis和mongodb的性能怎樣,只想說明下隨着數據量的增長,redis和mongodb,mysql是怎么變化的。
 
當物理內存不夠用的時候
redis和mongodb都會使用虛擬內存。
實際上如果redis要開始虛擬內存,那很明顯要么加內存條,要么你換個數據庫了。
但是,mongodb不一樣,只要,業務上能保證,冷熱數據的讀寫比,使得熱數據在物理內存中,mmap的交換較少。mongodb還是能夠保證性能。有人使用mongodb存儲了上T的數據。
mysql,mysql根本就不需要擔心數據量跟內存下的關系。不過,內存的量跟熱數據的關系會極大地影響性能表現。
 
當物理內存和虛擬內存都不夠用的時候
估計除了mysql你沒什么好選擇了。
 
 
其實,從數據存儲原理來看,我更傾向於將mongodb歸類為硬盤數據庫,但是使用了mmap作為加速的手段而已。
 
mmap的資料這里:
 
簡單來說就是:
mmap系統調用並不是完全為了用於共享內存而設計的。它本身提供了不同於一般對普通文件的訪問方式,進程可以像讀寫內存一樣對普通文件的操作。
 
mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間后,進程可以像訪問普通內存一樣對文件進行訪問,不必再調用read(),write()等操作。mmap並不分配空間, 只是將文件映射到調用進程的地址空間里, 然后你就可以用memcpy等操作寫文件, 而不用write()了.寫完后用msync()同步一下, 你所寫的內容就保存到文件里了. 不過這種方式沒辦法增加文件的長度, 因為要映射的長度在調用mmap()的時候就決定了.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM