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