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