1. 程式人生 > >MySQL、Redis、MongoDB區別

MySQL、Redis、MongoDB區別

MySQL 關係型資料庫

  • mysql資料和索引都存放在硬碟中。到要使用的時候才交換到記憶體中,能夠處理遠超過記憶體總量的資料。
  • 關係型資料庫
  • 在不同的引擎上有不同的儲存方式
  • 查詢語句是使用傳統的SQL語句,擁有較為成熟的體系,成熟度高
  • 開源資料庫的份額在不斷增加,MySQL的份額也在持續增長
  • 缺點就是海量資料處理的時候效率顯著變慢

Redis 非關係型資料庫

  • 記憶體資料庫
  • 持久化:
    • Redis所有資料都存放在記憶體中,持久化是使用RDB方式和AOF方式

RDB持久化也分兩種:SAVE和BGSAVE

  • SAVE是阻塞式的RDB持久化,當執行這個命令時redis的主程序把記憶體裡的資料庫狀態寫入到RDB檔案(即上面的dump.rdb)中,直到該檔案建立完畢的這段時間內redis將不能處理任何命令請求。
  • BGSAVE屬於非阻塞式的持久化,它會建立一個子程序專門去把記憶體中的資料庫狀態寫入RDB檔案裡,同時主程序還可以處理來自客戶端的命令請求。但子程序基本是複製的父程序,這等於兩個相同大小的redis程序在系統上執行,會造成記憶體使用率的大幅增加。

持久化之增量寫入:AOF 與RDB的儲存整個redis資料庫狀態不同,AOF是通過儲存對redis服務端的寫命令(如set、sadd、rpush)來記錄資料庫狀態的,即儲存你對redis資料庫的寫操作

MongoDB

  • 記憶體資料庫,資料都是存放在記憶體裡面
  • 對資料的操作大部分在記憶體中,但是MongoDB並不是單純的記憶體資料庫
  • MongoDB是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統
  • 在高負荷的情況下,新增更多的節點,,可以保證服務效能
  • MongoDB在web應用提供可擴充套件的高效能資料儲存方案
  • MongoDB將資料儲存為一個文件,資料結構由鍵值對(key=>value)組成,MongoDB文件類似於JSON物件,欄位值可以包含其他文件、陣列以及文件陣列

MongoDB 的儲存特點

  • 在傳統的關係型資料庫中,資料庫是以表單為媒介進行儲存的,每個表單均有縱向的列和橫向的行
  • 由此可見,相比較MySQL,MongoDB以一種直觀 的文件的方式來完成資料的儲存。它像JavaScript中定義的JSON格式,不過資料儲存的時候MongoDB資料庫為文件增加了序列化的操作,最終存進磁碟的其實是一種叫做BSON的格式,即Binary-JSON

MongoDB的應用場景

  • 資料格式無法明確定義時,MongoDB的這一鮮明特性脫穎而出,相比傳統資料庫,MongoDB非常容易被擴充套件,為寫程式碼帶來極大方便
  • 不過MongoDB對資料之間的事務支援比較弱,要是業務這方面要求比較高的話,MongoDB並不適合這型別的應用
  • 非關係型資料庫,屬於文件型別資料庫,文件型別資料庫就是可以存放xml、json、bson型別的資料,這些資料具備自述性,呈現分層的樹狀資料結構,資料由鍵值對(key=>value)組成

儲存方式:虛擬記憶體+持久化

  • 持久化方式:
    • MongoDB的所有資料實際是存放在硬碟的,所有要操作的資料通過mmap的方式對映到記憶體某個區域
    • 然後,MongoDB就在這塊區域裡面進行資料修改,避免了零碎的硬碟操作
    • 至於mmap上的內容flush到硬碟,系統宕機了,資料就會丟失

mongodb與mysql不同,mysql的每一次更新操作都會直接寫入硬碟,但是mongo不會,做為記憶體型資料庫,資料操作會先寫入記憶體,然後再會持久化到硬碟中去,那麼mongo是如何持久化的呢

mongodb在啟動時,專門初始化一個執行緒不斷迴圈(除非應用crash掉),用於在一定時間週期內來從defer佇列中獲取要持久化的資料並寫入到磁碟的journal(日誌)和mongofile(資料)處,當然因為它不是在使用者新增記錄時就寫到磁碟上,所以按mongodb開發者說,它不會造成效能上的損耗,因為看過程式碼發現,當進行CUD操作時,記錄(Record型別)都被放入到defer佇列中以供延時批量(groupcommit)提交寫入,但相信其中時間週期引數是個要認真考量的引數,系統為90毫秒,如果該值更低的話,可能會造成頻繁磁碟操作,過高又會造成系統宕機時資料丟失過

主要特點

  • MongoDB的提供了一個面向文件儲存,操作起來比較簡單和容易
  • 在MongoDB記錄中設定任何屬性的索引(如:FirstName=“summer”,Address=“8 G andhi Road”)來實現更快的排序
  • 通過本地或者網路建立資料映象,這使得MongoDB有更強的擴充套件性
  • 如果負載的增加(需要更多的儲存空間和更強的處理能力),它可以分散式在計算機網路中其他節點,這就是所謂的分片
  • MongoDB支援豐富的查詢表示式,查詢指令使用json形式的標記,可以輕易查詢文件中的內嵌的物件及陣列
  • MongoDB使用update()命令可以實現替換成的文件(資料)或者一些指定的資料欄位
  • MongoDB中map/reduce主要是用來對資料進行批量和聚合操作
  • map和reduce ,map函式呼叫emit(key,value)遍歷集合中所有的記錄,將key與value傳給reduce函式進行處理
  • MongoDB允許在服務端執行指令碼,可以用JavaScript編寫,直接在服務端執行,也可以把函式的定義儲存在服務端,下次呼叫
  • MongoDB支援多種語言,python、Java、c++、PHP
      1. 它裡面自帶了一個名叫 GirdFS 的分散式檔案系統,這就為 MongoDB 的部署提供了很大便利。而像 MySQL 這種比較早的資料庫,雖然市面上有很多不同的分表部署的方案,但這種終究不如 MongoDB 直接官方支援來得便捷實在。
      1. 另外,MongoDB 內部還自建了對 map-reduce運算框架的支援,雖然這種支援從功能上看還算是比較簡單的,相當於MySQL裡 GroupBy 功能的擴充套件版,不過也為資料的統計帶來了方便。
      1. MongoDB 在啟動後會將資料庫中的資料以檔案對映的方式載入到記憶體中。如果記憶體資源相當豐富的話,這將極大地提高資料庫的查詢速度,畢竟記憶體的 I/O 效率比磁碟高多了。
  • MongoDB 以 BSON 結構(二進位制)進行儲存,對海量資料儲存有著很明顯的優勢。

MongoDB 優點:

  • 1.效能優越:快速!在適量級的記憶體的 MongoDB 的效能是非常迅速的,它將熱資料儲存在實體記憶體中,使得熱資料的讀寫變得十分快,
  • 2.高擴充套件:第三方支援豐富(這是與其他的 No SQL 相比,MongoDB 也具有的優勢)
  • 3.自身的 Failover 機制!
  • 4.弱一致性(最終一致),更能保證使用者的訪問速度
  • 5.文件結構的儲存方式,能夠更便捷的獲取資料: json 的儲存格式
  • 6.支援大容量的儲存,內建 GridFS
  • 7.內建 Sharding

MongoDB 缺點:

####主要是無事物機制!

  • ① MongoDB 不支援事務操作(最主要的缺點)
  • ② MongoDB 佔用空間過大
  • ③ MongoDB 沒有如 MySQL 那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方