歡迎您光臨本站 註冊首頁

· mongodb redis雜誌閱讀

MySQL、MongoDB、Redis 資料庫之間的區別

admin @ 2020-04-18 reply:0

    NoSQL 的全稱是 Not Only SQL,也可以理解非關係型的資料庫,是一種新型的革命式的資料庫設計方式,不過它不是為了取代傳統的關係型資料庫而被設計的,它們分別代表了不同的資料庫設計思路。

MongoDB:

它是一個記憶體資料庫,資料都是放在記憶體裡面的。對資料的操作大部分都在記憶體中,但 MongoDB 並不是單純的記憶體資料庫。MongoDB 是由 C++ 語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。在高負載的情況下,新增更多的節點,可以保證伺服器效能。

MongoDB 旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。



MongoDB 的儲存特點

MongoDB 的應用場景

在傳統的關係型資料庫中,資料是以表單為媒介進行儲存的,每個表單均擁有縱向的列和橫向的行。由此可見,相比較 MySQL,MongoDB 以一種直觀文件的方式來完成資料的儲存。它很像 JavaScript 中定義的 JSON 格式,不過資料在儲存的時候 MongoDB 資料庫為文件增加了序列化的操作,最終存進磁碟的其實是一種叫做 BSON 的格式,即 Binary-JSON。在另一方面,對開發者來說,如果是因為業務需求或者是專案初始階段,而導致資料的具體格式無法明確定義的話,MongoDB的這一鮮明特性就脫穎而出了。相比傳統的關係型資料庫,它非常容易被擴充套件,這也為寫程式碼帶來了極大的方便。不過 MongoDB 對資料之間事務關係支援比較弱,如果業務這一方面要求比較高的話,MongoDB 還是並不適合此型別的應用。

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

持久化方式:

虛擬記憶體+持久化。MongoDB 的所有資料實際上是存放在硬碟的,所有要操作的資料通過 mmap 的方式對映到記憶體某個區域內。然後,MongoDB 就在這塊區域裡面進行資料修改,避免了零碎的硬碟操作。

至於 mmap上的內容flush到硬碟就是作業系統的事情了,所以,如果,MongoDB 在記憶體中修改了資料後,mmap 資料flush到硬碟之前,系統宕機了,資料就會丟失。

主要特點:

如果負載的增加(需要更多的儲存空間和更強的處理能力) ,它可以分佈在計算機網路中的其他節點上這就是所謂的分片。

GridFS 是 MongoDB 中的一個內建功能,可以用於存放大量小檔案。

MongoDB 允許在服務端執行指令碼,可以用 Javascript 編寫某個函式,直接在服務端執行,也可以把函式的定義儲存在服務端,下次直接呼叫即可。

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 操作。

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:

它就是一個不折不扣的記憶體資料庫。持久化方式:

Redis 所有資料都是放在記憶體中的,持久化是使用 RDB 方式或者 aof 方式。





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 (文件型資料庫):提供可擴充套件的高效能資料儲存

1、基於分散式檔案儲存

2、高負載情況下新增更多節點,可以保證伺服器效能

3、將資料儲存為一個文件

MongoDB 與 MySQL 的比較

1、穩定性

2、索引,索引放在記憶體中,能夠提升隨機讀寫的效能。如果索引不能完全放在記憶體,一旦出現隨機讀寫比較高的時候,就會頻繁地進行磁碟交換,MongoDB 的效能就會急劇下降

3、佔用的空間很大,因為它屬於典型空間換時間原則的型別。那么它的磁碟空間比普通資料庫會浪費一些,而且到目前為止它還沒有實現線上壓縮功能,

在 MongoDB 中頻繁的進行資料增刪改時,如果記錄變了,例如資料大小發生了變化,這時候容易產生一些資料碎片,出現碎片引發的結果,

一個是索引會出現效能問題,

另外一個就是在一定的時間後,所佔空間會莫明其妙地增大,所以要定期把資料庫做修復,定期重新做索引,這樣會提升MongoDB 的穩定性和效率。

在最新的版本里,它已經在實現線上壓縮,估計應該在2.0版左右,應該能夠實現線上壓縮,可以在後臺執行現在repair DataBase 的一些操作。如果那樣,就解決了目前困擾我們的大問題。

4、MongoDB 對資料間的事務關係支援比較弱

5、運維不方便

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的操作Ø 事務性系統

下面是 MongoDB 和 Redis 的對比圖:











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

[admin via ] MySQL、MongoDB、Redis 資料庫之間的區別已經有435次圍觀

http://coctec.com/magazine/show-post-item-73.html