一.MongoDB簡(jiǎn)介
什么是MongoDB ?
MongoDB 是由C++語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。
在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。
MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=》value)對(duì)組成。MongoDB 文檔類(lèi)似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
主要特點(diǎn)
MongoDB的提供了一個(gè)面向文檔存儲(chǔ),操作起來(lái)比較簡(jiǎn)單和容易。
你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)來(lái)實(shí)現(xiàn)更快的排序。
你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性。
如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。
Mongo支持豐富的查詢(xún)表達(dá)式。查詢(xún)指令使用JSON形式的標(biāo)記,可輕易查詢(xún)文檔中內(nèi)嵌的對(duì)象及數(shù)組。
MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
Mongodb中的Map/reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。
Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。
Map函數(shù)和Reduce函數(shù)是使用Javascript編寫(xiě)的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。
GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫(xiě)某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。
MongoDB支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語(yǔ)言。
MongoDB安裝簡(jiǎn)單。
MongoDB 下載
你可以在mongodb官網(wǎng)下載該安裝包,地址為: http://www.mongodb.org/downloads。MonggoDB支持以下平臺(tái):
OS X 32-bit
OS X 64-bit
Linux 32-bit
Linux 64-bit
Windows 32-bit
Windows 64-bit
Solaris i86pc
Solaris 64
MongoDB 工具
有幾種可用于MongoDB的管理工具。
監(jiān)控
MongoDB提供了網(wǎng)絡(luò)和系統(tǒng)監(jiān)控工具M(jìn)unin,它作為一個(gè)插件應(yīng)用于MongoDB中。
Gangila是MongoDB高性能的系統(tǒng)監(jiān)視的工具,它作為一個(gè)插件應(yīng)用于MongoDB中。
基于圖形界面的開(kāi)源工具 Cacti, 用于查看CPU負(fù)載, 網(wǎng)絡(luò)帶寬利用率,它也提供了一個(gè)應(yīng)用于監(jiān)控 MongoDB 的插件。
GUI
Fang of Mongo – 網(wǎng)頁(yè)式,由Django和jQuery所構(gòu)成。
Futon4Mongo – 一個(gè)CouchDB Futon web的mongodb山寨版。
Mongo3 – Ruby寫(xiě)成。
MongoHub – 適用于OSX的應(yīng)用程序。
Opricot – 一個(gè)基于瀏覽器的MongoDB控制臺(tái), 由PHP撰寫(xiě)而成。
Database Master — Windows的mongodb管理工具
RockMongo — 最好的PHP語(yǔ)言的MongoDB管理工具,輕量級(jí), 支持多國(guó)語(yǔ)言。
MongoDB 應(yīng)用案例
下面列舉一些公司MongoDB的實(shí)際應(yīng)用:
Craiglist上使用MongoDB的存檔數(shù)十億條記錄。
FourSquare,基于位置的社交網(wǎng)站,在Amazon EC2的服務(wù)器上使用MongoDB分享數(shù)據(jù)。
Shutterfly,以互聯(lián)網(wǎng)為基礎(chǔ)的社會(huì)和個(gè)人出版服務(wù),使用MongoDB的各種持久性數(shù)據(jù)存儲(chǔ)的要求。
bit.ly, 一個(gè)基于Web的網(wǎng)址縮短服務(wù),使用MongoDB的存儲(chǔ)自己的數(shù)據(jù)。
spike.com,一個(gè)MTV網(wǎng)絡(luò)的聯(lián)營(yíng)公司, spike.com使用MongoDB的。
Intuit公司,一個(gè)為小企業(yè)和個(gè)人的軟件和服務(wù)提供商,為小型企業(yè)使用MongoDB的跟蹤用戶(hù)的數(shù)據(jù)。
sourceforge.net,資源網(wǎng)站查找,創(chuàng)建和發(fā)布開(kāi)源軟件免費(fèi),使用MongoDB的后端存儲(chǔ)。
etsy.com ,一個(gè)購(gòu)買(mǎi)和出售手工制作物品網(wǎng)站,使用MongoDB。
紐約時(shí)報(bào),領(lǐng)先的在線(xiàn)新聞門(mén)戶(hù)網(wǎng)站之一,使用MongoDB。
CERN,著名的粒子物理研究所,歐洲核子研究中心大型強(qiáng)子對(duì)撞機(jī)的數(shù)據(jù)使用MongoDB。
http://www.runoob.com/mongodb/mongodb-intro.html
二、MongoDB和MySQL比較
MongoDB本身它還算比較年輕的一個(gè)產(chǎn)品,所以它的問(wèn)題,就是成熟度肯定沒(méi)有傳統(tǒng)MySQL那么成熟穩(wěn)定。所以在使用的時(shí)候,
第一,盡量使用穩(wěn)定版,不要在線(xiàn)上使用開(kāi)發(fā)版,這是一個(gè)大原則;
另外一點(diǎn),備份很重要,MongoDB如果出現(xiàn)一些異常情況,備份一定是要能跟上。除了通過(guò)傳統(tǒng)的復(fù)制的方式來(lái)做備份,離線(xiàn)備份也還是要有,不管你是用什么方式,都要有一個(gè)完整的離線(xiàn)備份。往往最后出現(xiàn)了特殊情況,它能幫助到你;
另外,MongoDB性能的一個(gè)關(guān)鍵點(diǎn)就是索引,索引是不是能有比較好的使用效率,索引是不是能夠放在內(nèi)存中,這樣能夠提升隨機(jī)讀寫(xiě)的性能。如果你的索引不能完全放在內(nèi)存中,一旦出現(xiàn)隨機(jī)讀寫(xiě)比較高的時(shí)候,它就會(huì)頻繁地進(jìn)行磁盤(pán)交換,這個(gè)時(shí)候,MongoDB的性能就會(huì)急劇下降,會(huì)出現(xiàn)波動(dòng)。
另外,MongoDB還有一個(gè)最大的缺點(diǎn),就是它占用的空間很大,因?yàn)樗鼘儆诘湫涂臻g換時(shí)間原則的類(lèi)型。那么它的磁盤(pán)空間比普通數(shù)據(jù)庫(kù)會(huì)浪費(fèi)一些,而且到目前為止它還沒(méi)有實(shí)現(xiàn)在線(xiàn)壓縮功能,在MongoDB中頻繁的進(jìn)行數(shù)據(jù)增刪改時(shí),如果記錄變了,例如數(shù)據(jù)大小發(fā)生了變化,這時(shí)候容易產(chǎn)生一些數(shù)據(jù)碎片,出現(xiàn)碎片引發(fā)的結(jié)果,一個(gè)是索引會(huì)出現(xiàn)性能問(wèn)題,
另外一個(gè)就是在一定的時(shí)間后,所占空間會(huì)莫明其妙地增大,所以要定期把數(shù)據(jù)庫(kù)做修復(fù),定期重新做索引,這樣會(huì)提升MongoDB的穩(wěn)定性和效率。在最新的版本里,它已經(jīng)在實(shí)現(xiàn)在線(xiàn)壓縮,估計(jì)應(yīng)該在2.0版左右,應(yīng)該能夠?qū)崿F(xiàn)在線(xiàn)壓縮,可以在后臺(tái)執(zhí)行現(xiàn)在repair DataBase的一些操作。如果那樣,就解決了目前困擾我們的大問(wèn)題。
三、問(wèn)題
用戶(hù)數(shù)據(jù)庫(kù)是用mongodb好,還是用mysql好?修改
打算給一系列產(chǎn)品統(tǒng)一賬戶(hù),程序用的是nodejs寫(xiě)的,用戶(hù)數(shù)據(jù)庫(kù)大概就是記錄用戶(hù)名、密碼、電子郵箱還有一些會(huì)高并發(fā)頻繁變更的信息,這種數(shù)據(jù)庫(kù)要用mongodb還是mysql?或者有更好的推薦嗎?
答案:
a1: mysql更通用 如果不知道選什么就選mysql錯(cuò)不了。 而mongodb的存在更多的是對(duì)于mysql的一個(gè)細(xì)分需求領(lǐng)域中的補(bǔ)充。
比如在游戲行業(yè)中 使用json格式的mongodb基本上可以滿(mǎn)足所有數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ), 而且你再也不必因?yàn)閿U(kuò)充一個(gè)小功能而糾結(jié)新建一個(gè)表來(lái)存儲(chǔ) 還是新建一個(gè)字段并用字符串來(lái)存儲(chǔ)(每次讀/寫(xiě)都要解析/序列化成字符串存儲(chǔ)), mysql是不是特別傻笨粗, 而游戲基本上前面搭好框子后面寫(xiě)業(yè)務(wù)的時(shí)候 一直都是在做這些東西。
但正如我上面說(shuō)的 mongodb只是一個(gè)細(xì)分需求領(lǐng)域的補(bǔ)充, 很多東西他做不了也做不好 假如你的程序哪怕有1%的功能在這里 這都容易悲劇。
另外說(shuō)一下題主問(wèn)題中提供的需求看法。
看上去是統(tǒng)一認(rèn)證系統(tǒng)或者認(rèn)證平臺(tái)之類(lèi)的需求。
一般有以下特點(diǎn)。
1. 數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單。 所以用mysql還是mongodb在這里都一樣。
2. 可能對(duì)讀性能有要求 但寫(xiě)速度關(guān)系不大, 一般都是大量已注冊(cè)用戶(hù)登錄。 因此mysql一定要配合redis或者memcache, 這樣的話(huà) mongodb稍微勝出一點(diǎn), mongodb本身的讀速度有優(yōu)化, 很可觀。
3. 數(shù)據(jù)結(jié)構(gòu)中含有一些特殊數(shù)據(jù) 比如玩家的充值信息。 mysql明顯比mongodb好的太多。
4. 日志統(tǒng)計(jì), mysql的存儲(chǔ)過(guò)程可以很方便的做很多統(tǒng)計(jì)工作, mongodb的話(huà)就要委屈后臺(tái)小哥多寫(xiě)點(diǎn)代碼來(lái)做統(tǒng)計(jì)了(實(shí)際上因?yàn)閿?shù)據(jù)簡(jiǎn)單 可能也就幾行代碼)。
因此呢 根據(jù)上面幾點(diǎn)來(lái)說(shuō), 用mongodb的意義不大, 但具體題主的需求, 自己根據(jù)上面我列舉的幾條可以自己再度量一下.
評(píng)論