mongodb,redis,mysql的區別和具體應用場景

一、MySQL

關係型數據庫。

在不同的引擎上有不同 的存儲方式。

查詢語句是使用傳統的sql語句,擁有較爲成熟的體系,成熟度很高。

開源數據庫的份額在不斷增加,mysql的份額頁在持續增長。

缺點就是在海量數據處理的時候效率會顯著變慢。

二、Mongodb

非關係型數據庫(nosql ),屬於文檔型數據庫。先解釋一下文檔的數據庫,即可以存放xml、json、bson類型系那個的數據。這些數據具備自述性(self-describing),呈現分層的樹狀數據結構。數據結構由鍵值(key=>value)對組成。

存儲方式:虛擬內存+持久化。

查詢語句:是獨特的Mongodb的查詢方式。

適合場景:事件的記錄,內容管理或者博客平臺等等。

架構特點:可以通過副本集,以及分片來實現高可用。

數據處理:數據是存儲在硬盤上的,只不過需要經常讀取的數據會被加載到內存中,將數據存儲在物理內存中,從而達到高速讀寫。

成熟度與廣泛度:新興數據庫,成熟度較低,Nosql數據庫中最爲接近關係型數據庫,比較完善的DB之一,適用人羣不斷在增長。

優勢:

  • 快速!在適量級的內存的Mongodb的性能是非常迅速的,它將熱數據存儲在物理內存中,使得熱數據的讀寫變得十分快,

  • 高擴展!

  • 自身的Failover機制!

  • json的存儲格式!

缺點:主要是無事物機制!

三、Redis

非關係型數據庫(nosql )

Redis數據全部存在內存,定期寫入磁盤,當內存不夠時,可以選擇指定的LRU算法刪除數據。

四、MongoDB和Redis區別

MongoDB和Redis都是NoSQL,採用結構型數據存儲。二者在使用場景中,存在一定的區別,這也主要由於
二者在內存映射的處理過程,持久化的處理方法不同。MongoDB建議集羣部署,更多的考慮到集羣方案,Redis
更偏重於進程順序寫入,雖然支持集羣,也僅限於主-從模式。

指標 MongoDB(v2.4.9) Redis(v2.4.17) 比較說明
實現語言  C++ C/C++ -
協議 BSON、自定義二進制 類Telnet -
性能 依賴內存,TPS較高 依賴內存,TPS非常高 Redis優於MongoDB
可操作性 豐富的數據表達、索引;最類似於關係數據庫,支持豐富的查詢語言 數據豐富,較少的IO MongoDB優於Redis
內存及存儲 適合大數據量存儲,依賴系統虛擬內存管理,採用鏡像文件存儲;內存佔有率比較高,官方建議獨立部署在64位系統(32位有最大2.5G文件限制,64位沒有改限制) Redis2.0後增加虛擬內存特性,突破物理內存限制;數據可以設置時效性,類似於memcache 不同的應用角度看,各有優勢
可用性 支持master-slave,replicaset(內部採用paxos選舉算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制 依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點重新連接主節點都要依賴整個快照,無增量複製;不支持自動sharding,需要依賴程序設定一致hash機制 MongoDB優於Redis;單點問題上,MongoDB應用簡單,相對用戶透明,Redis比較複雜,需要客戶端主動解決。(MongoDB 一般會使用replica sets和sharding功能結合,replica sets側重高可用性及高可靠性,而sharding側重於性能、易擴展)
可靠性 從1.8版本後,採用binlog方式(MySQL同樣採用該方式)支持持久化,增加可靠性 依賴快照進行持久化;AOF增強可靠性;增強可靠性的同時,影響訪問性能 MongoDB優於Redis
一致性 不支持事物,靠客戶端自身保證 支持事物,比較弱,僅能保證事物中的操作按順序執行 Redis優於MongoDB
數據分析 內置數據分析功能(mapreduce) 不支持 MongoDB優於Redis
應用場景 海量數據的訪問效率提升 較小數據量的性能及運算 MongoDB優於Redis

五、Mysql和Mongodb應用場景

MongoDB 的適用場景爲:數據不是特別重要(例如通知,推送這些),數據表結構變化較爲頻繁,數據量特別大,數據的併發性特別高,數據結構比較特別(例如地圖的位置座標),這些情況下用 MongoDB , 其他情況就還是用 MySQL ,這樣組合使用就可以達到最大的效率。

  • 1.如果需要將mongodb作爲後端db來代替mysql使用,即這裏mysql與mongodb 屬於平行級別,那麼,這樣的使用可能有以下幾種情況的考量: (1)mongodb所負責部分以文檔形式存儲,能夠有較好的代碼親和性,json格式的直接寫入方便。(如日誌之類) (2)從data models設計階段就將原子性考慮於其中,無需事務之類的輔助。開發用如nodejs之類的語言來進行開發,對開發比較方便。 (3)mongodb本身的failover機制,無需使用如MHA之類的方式實現。

  • 2.將mongodb作爲類似redis ,memcache來做緩存db,爲mysql提供服務,或是後端日誌收集分析。 考慮到mongodb屬於nosql型數據庫,sql語句與數據結構不如mysql那麼親和 ,也會有很多時候將mongodb做爲輔助mysql而使用的類redis memcache 之類的緩存db來使用。 亦或是僅作日誌收集分析。

MongoDB 有一個最大的缺點,就是它佔用的空間很大,因爲它屬於典型空間換時間原則的類型。那麼它的磁盤空間比普通數據庫會浪費一些,而且到目前爲止它還沒有實現在線壓縮功能,在 MongoDB 中頻繁的進行數據增刪改時,如果記錄變了,例如數據大小發生了變化,這時候容易產生一些數據碎片,出現碎片引發的結果,一個是索引會出現性能問題。
另外一個就是在一定的時間後,所佔空間會莫明其妙地增大,所以要定期把數據庫做修復,定期重新做索引,這樣會提升MongoDB 的穩定性和效率。

1.MySQL 來自女兒的名字; MongoDB 來自 humongous
2.MySQL 使用 Table/Row/Column; MongoDB 使用 Collection/Document
3.MySQL 需要指定 table 的 schema; MongoDB的 collection 的每個 document 的 schema 可以自由修改
4.MySQL 支持 join; MongoDB 沒有 join
5.MySQL 使用 SQL 語言; MongoDB 使用類似 JavaScript 的函數

命令對比
MongoDB 與 MySQL 命令對比 傳統的關係數據庫一般由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB 是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對於關係型數據庫裏的表,但是集合中沒有列、行和關係概念,這體現了模式自由的特點。

六、MySQL 與 Redis 的區別

MySQL 是持久化存儲,存放在磁盤裏面,檢索的話,會涉及到一定的 IO,爲了解決這個瓶頸,於是出現了緩存,比如現在用的最多的 memcached(簡稱mc)。首先,用戶訪問mc,如果未命中,就去訪問 MySQL,之後像內存和硬盤一樣,把數據複製到mc一部分。

  Redis 和mc都是緩存,並且都是駐留在內存中運行的,這大大提升了高數據量web訪問的訪問速度。然而mc只是提供了簡單的數據結構,比如 string存儲;Redis卻提供了大量的數據結構,比如string、list、set、hashset、sorted set這些,這使得用戶方便了好多,畢竟封裝了一層實用的功能,同時實現了同樣的效果,當然用Redis而慢慢捨棄mc。
  內存和硬盤的關係,硬盤放置主體數據用於持久化存儲,而內存則是當前運行的那部分數據,CPU訪問內存而不是磁盤,這大大提升了運行的速度,當然這是基於程序的局部化訪問原理。
  推理到 Redis + MySQL,它是內存+磁盤關係的一個映射,MySQL 放在磁盤,Redis放在內存,這樣的話,web應用每次只訪問Redis,如果沒有找到的數據,纔去訪問 MySQL。
  然而 Redis + MySQL 和內存+磁盤的用法最好是不同的。
前者是內存數據庫,數據保存在內存中,當然速度快。
後者是關係型數據庫,功能強大,數據訪問也就慢。
像memcache,MongoDB,Redis,都屬於No SQL系列。
不是一個類型的東西,應用場景也不太一樣,還是要看你的需求來決定。

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章