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