對比mysql, mongo的優缺點有:html
缺點mysql
l 不支持事務操做sql
l 佔用空間過大mongodb
l MongoDB沒有如MySQL那樣成熟的維護工具數據庫
l 沒法進行關聯表查詢,不適用於關係多的數據api
l 複雜聚合操做經過mapreduce建立,速度慢服務器
| 模式自由, 自由靈活的文件存儲格式帶來的數據錯誤併發
|負載均衡
mongodb採用數據文件預分配模式來生成數據文件,數據文件的大小從64M開始,每增長一個文件,大小翻倍,直到2G,之後每次增長數據就會生成2G左右的數據文件,結合mongodb的mmap內存模型,對於寫數據文件,將隨機寫轉換爲順序寫,必定程度上緩解了磁盤的io壓力。nosql
但在實際使用中,遇到了在預分配2G的數據文件時,若是磁盤io較慢,則mongodb基本鎖死,沒法響應請求的狀況。持續時間則根據磁盤io的性能來肯定。這個問題在2.0以後版本可能會有些改善,但在磁盤性能低的服務器上,該問題依舊存在.
這個問題目前沒有太好的解決方案,只能建議使用讀寫性能比較好的服務器來跑mongodb。
mongodb使用mmap的內存管理模式,若是查詢的都是熱數據,那麼會在內存中直接查詢,若是遇到冷數據,就須要從磁盤讀取,並將一部分熱數據從內存卸載掉.
有人曾經說mongodb內存管理是加載固定大小的文件塊到內存,即若是冷數據在磁盤上,他會根據請求的數據,加載必定大小的數據塊到內存,並卸載掉一樣的熱數據,這個操做自己會帶來必定io.
由於mongodb使用的是全局鎖,在某個操做緩慢時,整個操做隊列會所有變慢。這個問題形成了mongodb會出現偶發性堵塞問題,連帶整個庫的性能降低。
該問題在應用須要儘可能避免出現,須要將mongodb的數據大小規劃好,儘可能不要使數據量超過內存的大小,若是超過內存大小後,儘可能不要去請求冷數據。
mongodb最大的問題或者能夠說是它的鎖機制,在2.2版本以前,一個實例只有一個讀寫鎖,無論有多少數據庫和數據集合,當一個操做進行時其餘操做只能等待,在2.2版本後,mongodb鎖下降了粒度,改成按庫鎖。
MongoDB 使用的是「readers-writer」鎖, 能夠支持併發但有很大的侷限性,當一個讀鎖存在,許多讀操做可使用這把鎖,然而, 當一個寫鎖的存在,一個單一的寫操做會exclusively 持有該鎖,同時其它讀,寫操做不能使用共享這個鎖;舉個例子,假設一個集合裏有 10 個文檔,多個 update 操做不能併發在這個集合上,即便是更新不一樣的文檔。
mongodb刪除集合後磁盤空間不釋放,只有用db.repairDatabase()去修復才能釋放。
修復可能要花費很長的時間,在使用db.repairDatabase()去修復時必定要停掉讀寫,而且mongodb要有備機才能夠,否則千萬不要隨便使用db.repairDatabase()來修復數據庫,切記。
可是在修復的過程當中若是出現了非正常的mongodb的掛掉,再次啓動時啓動不了的,須要先修復才能夠,能夠利用./mongod --repair --dbpath=/data/mongo/ 若是你是把數據庫單獨的放在一個文件夾中指定dbpath時就指向要修復的數據庫就能夠。
7. replica set一些隱含問題
a) replica set模式最多支持12臺服務器,而有投票權的服務器只支持7臺,若是超過7臺服務器,需設置部分服務器爲無投票權服務器
b) replica set模式中,一個set服務器若是小於2臺服務器,則自動故障恢復不會起做用,若是4臺服務器出現2/2互相ping不通的狀況,一樣不會自動故障恢復。通常來講,一個set中儘可能是有單數服務器。
c). replica set中,由於mongodb是按照時間進行操做,若是set中某個服務器時間超前或者延遲,很容易出現secondaries不斷嘗試更新oplog或者同步延遲的問題。甚至形成某些操做失敗,如drop操做。
8. 分片模式的一些隱含問題
1. config server儘可能按照官方的要求,有3個configserver,若是隻有2個configserver,則shard的自動負載均衡和自動切片功能不可用。
2. api中的nearest模式在shard中,判斷的是set到mongos的距離而非set到client的距離,在切片模式下,儘可能不要使用nearest模式,可能會形成一些請求延遲增長的問題。
優勢
l 文檔結構的存儲方式,可以更便捷的獲取數據
l 內置GridFS,支持大容量的存儲
l 內置Sharding,分片簡單
l 海量數據下,性能優越
l 支持自動故障恢復(複製集)
mongodb是一個介於nosql數據庫和mysql數據庫之間的一個數據存儲系統,它沒有嚴格的數據格式,但同時支持複雜查詢,並且自帶sharding模式和Replica Set模式,支持分片模式,複製模式,自動故障處理,自動故障轉移,自動擴容,全內容索引,動態查詢等功能。擴展性和功能都比較強大。
mongodb在數據查詢方面,支持類sql查詢,能夠一個key多value內容,能夠組合多個value內容來查詢,支持索引,支持聯合索引,支持複雜查詢 ,支持排序,基本上除了join和事務類型的操做外,mongodb支持全部mysql支持的查詢,甚至某個客戶端api支持直接使用sql語句查詢mongodb。
mongodb的sharding功能目前日漸完善,支持自定義範圍分片,hash自動分片等,分片自動擴容,shard之間自動負載均衡等功能。實際使用中功能還不錯。