一、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系列。
不是一個類型的東西,應用場景也不太一樣,還是要看你的需求來決定。