NoSQL 的全稱是 Not Only SQL,也能夠理解非關係型的數據庫,是一種新型的革命式的數據庫設計方式,不過它不是爲了取代傳統的關係型數據庫而被設計的,它們分別表明了不一樣的數據庫設計思路。node
MongoDB:
它是一個內存數據庫,數據都是放在內存裏面的。
對數據的操做大部分都在內存中,但 MongoDB 並非單純的內存數據庫。
MongoDB 是由 C++ 語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。
在高負載的狀況下,添加更多的節點,能夠保證服務器性能。linux
MongoDB 旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。web
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。算法
MongoDB 的存儲特色
在傳統的關係型數據庫中,數據是以表單爲媒介進行存儲的,每一個表單均擁有縱向的列和橫向的行。sql
因而可知,相比較 MySQL,MongoDB 以一種直觀文檔的方式來完成數據的存儲。它很像 JavaScript 中定義的 JSON 格式,不過數據在存儲的時候 MongoDB 數據庫爲文檔增長了序列化的操做,最終存進磁盤的實際上是一種叫作 BSON 的格式,即 Binary-JSON。數據庫
MongoDB 的應用場景
在另外一方面,對開發者來講,若是是由於業務需求或者是項目初始階段,而致使數據的具體格式沒法明肯定義的話,MongoDB的這一鮮明特性就脫穎而出了。相比傳統的關係型數據庫,它很是容易被擴展,這也爲寫代碼帶來了極大的方便。編程
不過 MongoDB 對數據之間事務關係支持比較弱,若是業務這一方面要求比較高的話,MongoDB 仍是並不適合此類型的應用。
非關係型數據庫(NoSQL ),屬於文檔型數據庫。先解釋一下文檔的數據庫,便可以存放 xml、json、bson 類型系那個的數據。這些數據具有自述性(self-describing),呈現分層的樹狀數據結構。數據結構由鍵值(key=>value)對組成。json
存儲方式:虛擬內存+持久化。
持久化方式:
MongoDB 的全部數據其實是存放在硬盤的,全部要操做的數據經過 mmap 的方式映射到內存某個區域內。
而後,MongoDB 就在這塊區域裏面進行數據修改,避免了零碎的硬盤操做。
至於 mmap上的內容flush到硬盤就是操做系統的事情了,因此,若是,MongoDB 在內存中修改了數據後,mmap 數據flush到硬盤以前,系統宕機了,數據就會丟失。後端
主要特色:
MongoDB 的提供了一個面向文檔存儲,操做起來比較簡單和容易。
你能夠在 MongoDB 記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
你能夠經過本地或者網絡建立數據鏡像,這使得 MongoDB 有更強的擴展性。
若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。
MongoDB 支持豐富的查詢表達式。查詢指令使用 JSON 形式的標記,可輕易查詢文檔中內嵌的對象及數組。
MongoDB 使用 update() 命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。
MongoDB 中的 Map/reduce 主要是用來對數據進行批量處理和聚合操做。
Map 和 Reduce。Map 函數調用 emit(key,value) 遍歷集合中全部的記錄,將 key 與 value 傳給 Reduce 函數進行處理。
Map 函數和 Reduce 函數是使用 JavaScript 編寫的,並能夠經過 db.runCommand 或 mapreduce 命令來執行 MapReduce 操做。
GridFS 是 MongoDB 中的一個內置功能,能夠用於存放大量小文件。
MongoDB 容許在服務端執行腳本,能夠用 Javascript 編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
MongoDB支持各類編程語言:RUBY,PYTHON,JAVA,C++,PHP,C# 等多種語言。數組
1. 它裏面自帶了一個名叫 GirdFS 的分佈式文件系統,這就爲 MongoDB 的部署提供了很大便利。而像 MySQL 這種比較早的數據庫,雖然市面上有不少不一樣的分表部署的方案,但這種終究不如 MongoDB 直接官方支持來得便捷實在。
2. 另外,MongoDB 內部還自建了對 map-reduce運算框架的支持,雖然這種支持從功能上看還算是比較簡單的,至關於MySQL裏 GroupBy 功能的擴展版,不過也爲數據的統計帶來了方便。
3. MongoDB 在啓動後會將數據庫中的數據以文件映射的方式加載到內存中。若是內存資源至關豐富的話,這將極大地提升數據庫的查詢速度,畢竟內存的 I/O 效率比磁盤高多了。
MongoDB 以 BSON 結構(二進制)進行存儲,對海量數據存儲有着很明顯的優點。
監控
MongoDB提供了網絡和系統監控工具Munin,它做爲一個插件應用於MongoDB中。
Gangila是MongoDB高性能的系統監視的工具,它做爲一個插件應用於MongoDB中。
基於圖形界面的開源工具 Cacti, 用於查看CPU負載, 網絡帶寬利用率,它也提供了一個應用於監控 MongoDB 的插件。
查詢語句:是獨特的 MongoDB 的查詢方式。
適合場景:事件的記錄,內容管理或者博客平臺等等。
架構特色:能夠經過副本集,以及分片來實現高可用。
數據處理:數據是存儲在硬盤上的,只不過須要常常讀取的數據會被加載到內存中,將數據存儲在物理內存中,從而達到高速讀寫。
成熟度與普遍度:新興數據庫,成熟度較低,No SQL 數據庫中最爲接近關係型數據庫,比較完善的 DB 之一,適用人羣不斷在增加。
MongoDB 優勢:
1.性能優越:快速!在適量級的內存的 MongoDB 的性能是很是迅速的,它將熱數據存儲在物理內存中,使得熱數據的讀寫變得十分快,
2.高擴展:第三方支持豐富(這是與其餘的 No SQL 相比,MongoDB 也具備的優點)
3.自身的 Failover 機制!
4.弱一致性(最終一致),更能保證用戶的訪問速度
5.文檔結構的存儲方式,可以更便捷的獲取數據: json 的存儲格式
6.支持大容量的存儲,內置 GridFS
7.內置 Sharding
MongoDB 缺點:
主要是無事物機制!
① MongoDB 不支持事務操做(最主要的缺點)
② MongoDB 佔用空間過大
③ MongoDB 沒有如 MySQL 那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方
Redis:
它就是一個徹徹底底的內存數據庫。
MySQL:
不管數據仍是索引都存放在硬盤中。到要使用的時候才交換到內存中。可以處理遠超過內存總量的數據。
關係型數據庫。
在不一樣的引擎上有不一樣 的存儲方式。
查詢語句是使用傳統的 SQL 語句,擁有較爲成熟的體系,成熟度很高。
開源數據庫的份額在不斷增長,MySQL 的份額頁在持續增加。
缺點就是在海量數據處理的時候效率會顯著變慢。
數據量和性能的比較:
當物理內存夠用的時候,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() 的時候就決定了。
MongoDB 與 MySQL 的適用場景:
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 屬於 No SQL 型數據庫,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對於關係型數據庫裏的表,可是集合中沒有列、行和關係概念,這體現了模式自由的特色。
MongoDB (文檔型數據庫):提供可擴展的高性能數據存儲
一、基於分佈式文件存儲
二、高負載狀況下添加更多節點,能夠保證服務器性能
三、將數據存儲爲一個文檔
MongoDB 與 MySQL 的比較
一、穩定性
二、索引,索引放在內存中,可以提高隨機讀寫的性能。若是索引不能徹底放在內存,一旦出現隨機讀寫比較高的時候,就會頻繁地進行磁盤交換,MongoDB 的性能就會急劇降低
三、佔用的空間很大,由於它屬於典型空間換時間原則的類型。那麼它的磁盤空間比普通數據庫會浪費一些,並且到目前爲止它尚未實如今線壓縮功能,
在 MongoDB 中頻繁的進行數據增刪改時,若是記錄變了,例如數據大小發生了變化,這時候容易產生一些數據碎片,出現碎片引起的結果,
一個是索引會出現性能問題,
另一個就是在必定的時間後,所佔空間會莫明其妙地增大,因此要按期把數據庫作修復,按期從新作索引,這樣會提高MongoDB 的穩定性和效率。
在最新的版本里,它已經在實如今線壓縮,估計應該在2.0版左右,應該可以實如今線壓縮,能夠在後臺執行如今repair DataBase 的一些操做。若是那樣,就解決了目前困擾咱們的大問題。
四、MongoDB 對數據間的事務關係支持比較弱
五、運維不方便
MongoDB 相對於 MySQL 的優點
1. 適合那些對數據庫具體數據格式不明確或者數據庫數據格式常常變化的需求模型,並且對開發者十分友好。
2. 自帶一個分佈式文件系統,能夠很方便地部署到服務器機羣上。
MongoDB 裏有一個Shard的概念,就是方便爲了服務器分片使用的。每增長一臺Shard,MongoDB 的插入性能也會以接近倍數的方式增加,磁盤容量也很能夠很方便地擴充。
3. 自帶了對map-reduce運算框架的支持,這也很方便進行數據的統計。相似於group by
MongoDB 與 MySQL 命令對比 傳統的關係數據庫通常由數據庫(database)、表(table)、記錄(record)三個層次概念組成,
MongoDB 是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。
MongoDB 對於關係型數據庫裏的表,可是集合中沒有列、行和關係概念,這體現了模式自由的特色。
MongoDB 和 Redis 的區別:
MongoDB 更相似 MySQL,支持字段索引、遊標操做,其優點在於查詢功能比較強大,擅長查詢 JSON 數據,能存儲海量數據,可是不支持事務。
MySQL 在大數據量時效率顯著降低,MongoDB 更多時候做爲關係數據庫的一種替代。
內存管理機制
Redis 數據所有存在內存,按期寫入磁盤,當內存不夠時,能夠選擇指定的 LRU 算法刪除數據。
MongoDB 數據存在內存,由 linux系統 mmap 實現,當內存不夠時,只將熱點數據放入內存,其餘數據存在磁盤。
支持的數據結構
Redis 支持的數據結構豐富,包括hash、set、list等。
MongoDB 數據結構比較單一,可是支持豐富的數據表達,索引,最相似關係型數據庫,支持的查詢語言很是豐富。
性能
兩者性能都比較高,應該說都不會是瓶頸。
可靠性
兩者均支持持久化。
集羣
MongoDB 集羣技術比較成熟,Redis從3.0開始支持集羣。
不適用的場景
Ø 須要使用複雜sql的操做
Ø 事務性系統
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系列。不是一個類型的東西,應用場景也不太同樣,仍是要看你的需求來決定。