Mongodb是一個介于關系數據庫和非關系數據庫之間的產品,由 C++ 語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。Mongodb官方中文版支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,可以實現類似關系數據庫單表查詢的大部分功能。
面向集合存儲,易存儲對象類型的數據。
模式自由。
支持動態查詢。
支持完全索引,包含內部對象。
支持查詢。
支持復制和故障恢復。
使用高效的二進制數據存儲,包括大型對象(如視頻等)。
自動處理碎片,以支持云計算層次的擴展性
支持RUBY,PYTHON,JAVA,C++,PHP等多種語言。
文件存儲格式為BSON(一種JSON的擴展)
可通過網絡訪問
MongoDB 的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)和傳統的RDBMS 系統(具有豐富的功能)之間架起一座橋梁,它集兩者的優勢于一身。根據官方網站的描述,Mongo 適用于以下場景。
● 網站數據:Mongo 非常適合實時的插入,更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性。
● 緩存:由于性能很高,Mongo 也適合作為信息基礎設施的緩存層。在系統重啟之后,由Mongo 搭建的持久化緩存層可以避免下層的數據源過載。
● 大尺寸、低價值的數據:使用傳統的關系型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
● 高伸縮性的場景:Mongo 非常適合由數十或數百臺服務器組成的數據庫,Mongo 的路線圖中已經包含對MapReduce 引擎的內置支持。
● 用于對象及JSON 數據的存儲:Mongo 的BSON 數據格式非常適合文檔化格式的存儲及查詢。
MongoDB 的使用也會有一些限制,例如,它不適合于以下幾個地方。
● 高度事務性的系統:例如,銀行或會計系統。傳統的關系型數據庫目前還是更適用于需要大量原子性復雜事務的應用程序。
● 傳統的商業智能應用:針對特定問題的BI 數據庫會產生高度優化的查詢方式。對于此類應用,數據倉庫可能是更合適的選擇。
● 需要SQL 的問題。
一、B-樹和B+樹的區別
很明顯,我們要想弄清楚原因就要知道B-樹和B+樹的區別。為了不長篇大論。我們直接給出他們的形式總結他們的特點。
1、B-樹
B-樹是一種自平衡的搜索樹,形式很簡單:
這就是一顆B-樹。針對我們這個問題的最核心的特點如下:
(1)多路,非二叉樹
(2)每個節點既保存索引,又保存數據
(3)搜索時相當于二分查找
在這里我們假定都已經了解了B樹相關的結構。
2、B+樹
B+樹是B-樹的變種
最核心的特點如下:
(1)多路非二叉
(2)只有葉子節點保存數據
(3)搜索時相當于二分查找
(4)增加了相鄰接點的指向指針。
從上面我們可以看出最核心的區別主要有倆,一個是數據的保存位置,一個是相鄰節點的指向。就是這倆造成了MongoDB和Mysql的差別。為什么呢?
3、B-樹和B+樹的區別
(1)B+樹查詢時間復雜度固定是logn,B-樹查詢復雜度最好是 O(1)。
(2)B+樹相鄰接點的指針可以大大增加區間訪問性,可使用在范圍查詢等,而B-樹每個節點 key 和 data 在一起,則無法區間查找。
(3)B+樹更適合外部存儲,也就是磁盤存儲。由于內節點無 data 域,每個節點能索引的范圍更大更精確
(4)注意這個區別相當重要,是基于(1)(2)(3)的,B-樹每個節點即保存數據又保存索引,所以磁盤IO的次數很少,B+樹只有葉子節點保存,磁盤IO多,但是區間訪問比較好。
有了他們的區別之后,現在我們再來解釋這個原因就好多了。
二、原因解釋
想要解釋原因,我們還必須要了解一下MongoDB和Mysql的基本概念。
1、MongoDB
MongoDB 是文檔型的數據庫,是一種 nosql,它使用類 Json 格式保存數據。比如之前我們的表可能有用戶表、訂單表、購物籃表等等,還要建立他們之間的外鍵關聯關系。但是類Json就不一樣了。
我們可以看到這種形式更簡單,通俗易懂。那為什么 MongoDB 使用B-樹呢?
MongoDB使用B-樹,所有節點都有Data域,只要找到指定索引就可以進行訪問,無疑單次查詢平均快于Mysql。
2、Mysql
Mysql作為一個關系型數據庫,數據的關聯性是非常強的,區間訪問是常見的一種情況,B+樹由于數據全部存儲在葉子節點,并且通過指針串在一起,這樣就很容易的進行區間遍歷甚至全部遍歷。
MongoDB默認的數據目錄為:C:\data\db。如果不用默認目錄,則需要在在mongod.exe命令后加--dbpath參數。
創建數據目錄。我創建的是D:\dev\mongodb-win32-x86_64-2.4.5\data\db
創建日志目錄及其文件。我創建的是D:\dev\mongodb-win32-x86_64-2.4.5\log及D:\dev\mongodb-win32-x86_64-2.4.5\log\log.txt。
1、啟動MongoDB
打開cmd窗口(cmd.exe),進入D:\dev\mongodb-win32-x86_64-2.4.5\bin,執行mongod.exe命令,見下圖。
mongod.exe --logpath=D:\dev\mongodb-win32-x86_64-2.4.5\log\log.txt --dbpath=D:\dev\mongodb-win32-x86_64-2.4.5\data\db!
--logpath 參數是設定日志文件的路徑。
--dbpath 參數是設定數據庫文件的存放路徑。
mongod.exe命令的所有參數選項可通過mongod.exe --help查看。
2、作為服務進行安裝
使用管理員權限打開windows的cmd窗口,進入D:\dev\mongodb-win32-x86_64-2.4.5\bin目錄。
mongod.exe --install --logpath=D:\dev\mongodb-win32-x86_64-2.4.5\log\log.txt --dbpath=D:\dev\mongodb-win32-x86_64-2.4.5\data\db
--install 參數是設定安裝為服務器!
設置為服務后,即可在cmd(管理員權限打開的windows cmd窗口)窗口用服務的方式啟動或停止MongoDB。
net start mongodb 啟動mongodb服務
3、進入shell環境界面
進入sheelMongoDB后,在cmd窗口進入D:\dev\mongodb-win32-x86_64-2.4.5\bin目錄,輸入mongo.exe,則可以進入shell環境界面。
MongoDB和Redis的區別是什么?
1、內存管理機制
Redis 數據全部存在內存,定期寫入磁盤,當內存不夠時,可以選擇指定的 LRU 算法刪除數據。
MongoDB 數據存在內存,由 linux系統 mmap 實現,當內存不夠時,只將熱點數據放入內存,其他數據存在磁盤。
2、支持的數據結構
Redis 支持的數據結構豐富,包括hash、set、list等。
MongoDB 數據結構比較單一,但是支持豐富的數據表達,索引,最類似關系型數據庫,支持的查詢語言非常豐富。
3、數據量和性能:
當物理內存夠用的時候,redis>mongodb>mysql
當物理內存不夠用的時候,redis和mongodb都會使用虛擬內存。
實際上如果redis要開始虛擬內存,那很明顯要么加內存條,要么你換個數據庫了。
但是,mongodb不一樣,只要,業務上能保證,冷熱數據的讀寫比,使得熱數據在物理內存中,mmap的交換較少。
mongodb還是能夠保證性能。
4、性能
mongodb依賴內存,TPS較高;Redis依賴內存,TPS非常高。性能上Redis優于MongoDB。
5、可靠性
mongodb從1.8版本后,采用binlog方式(MySQL同樣采用該方式)支持持久化,增加可靠性;
Redis依賴快照進行持久化;AOF增強可靠性;增強可靠性的同時,影響訪問性能。
可靠性上MongoDB優于Redis。
6、數據分析
mongodb內置數據分析功能(mapreduce);而Redis不支持。
7、事務支持情況
Redis 事務支持比較弱,只能保證事務中的每個操作連續執行;mongodb不支持事務。
8、集群
MongoDB 集群技術比較成熟,Redis從3.0開始支持集群。