幾十年來,關(guān)系型數(shù)據(jù)庫已經(jīng)成為企業(yè)應用程序的基礎(chǔ),自從MySQL在1995年發(fā)布以來,深受企業(yè)的偏愛。然而隨著近年來數(shù)據(jù)量和數(shù)據(jù)的不斷激增,非關(guān)系數(shù)據(jù)庫技術(shù)如MongoDB應運而生,以滿足新應用的需求。 MongoDB用于新的應用程序,以及擴充或替換現(xiàn)有的關(guān)系型基礎(chǔ)設(shè)施(關(guān)系型數(shù)據(jù)庫)。
MongoDB勢頭正熱,不少人要問,MongoDB是不是要“干掉”MySQL,獨霸武林了?讓我們一起看看數(shù)據(jù)庫之間的恩恩怨怨吧。
MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
與關(guān)系型數(shù)據(jù)庫相比,MongoDB的優(yōu)點:
1. 弱一致性(最終一致),更能保證用戶的訪問速度。
2.文檔結(jié)構(gòu)的存儲方式,能夠更便捷的獲取數(shù)據(jù)。 對于一個層級式的數(shù)據(jù)結(jié)構(gòu)來說,如果要將這樣的數(shù)據(jù)使用扁平式的,表狀的結(jié)構(gòu)來保存數(shù)據(jù),這無論是在查詢還是獲取數(shù)據(jù)時都十分困難。
3.內(nèi)置GridFS,支持大容量的存儲。GridFS是一個出色的分布式文件系統(tǒng),可以支持海量的數(shù)據(jù)存儲。內(nèi)置了GridFS了MongoDB,能夠滿足對大數(shù)據(jù)集的快速范圍查詢。
4.內(nèi)置Sharding。提供基于Range的Auto Sharding機制:一個collection可按照記錄的范圍,分成若干個段,切分到不同的Shard上。 Shards可以和復制結(jié)合,配合Replica sets能夠?qū)崿F(xiàn)Sharding+fail-over,不同的Shard之間可以負載均衡。
5.官方支持,安全有保障。開源文檔數(shù)據(jù)庫MongoDB背后有商業(yè)公司10gen為其提供供商業(yè)培訓和支持。而且MongoDB社區(qū)非常活躍,很多開發(fā)框架都迅速提供了對MongoDB的支持。不少知名大公司和網(wǎng)站也在生產(chǎn)環(huán)境中使用MongoDB,越來越多的創(chuàng)新型企業(yè)轉(zhuǎn)而使用MongoDB作為和Django,RoR來搭配的技術(shù)方案。
6.性能優(yōu)越:千萬級別的文檔對象或近10G的數(shù)據(jù),對有索引的ID的查詢不會比MySql慢,而對非索引字段的查詢,則是全面勝出。MySql實際無法勝任大數(shù)據(jù)量下任意字段的查詢,而Mongodb的查詢性能超高。寫入性能同樣很令人滿意。
與關(guān)系型數(shù)據(jù)庫相比,MongoDB的缺點:
但在很多情況下MongoDB并如MySql。
1. MongoDB不支持事務,事務要求嚴格的系統(tǒng)(如果銀行系統(tǒng))不能用它。但在文檔級別,具有原子性。
2. 對于復制環(huán)境,有關(guān)寫入問題的配置注意事項都是以犧牲性能為代價的。寫入方面將驗證副本是否已寫入信息,默認情況下,MongoDB將寫請求設(shè)置為僅從主計算機請求確認,而不是副本。因為如果副本有問題,就會導致一致性問題。關(guān)于其原因,在官方的FAQ中,提到有如下幾個方面:
A. 空間的預分配;
B. 字段名所占用的空間;
C. 刪除記錄不釋放空間。
雖然大多數(shù)現(xiàn)代應用程序需要一個靈活的可擴展系統(tǒng),如MongoDB,但是有一些關(guān)系數(shù)據(jù)庫(如MySQL)將更適合使用的情況。需要復雜的多行事務的應用程序(例如雙記錄bookkeep系統(tǒng))將是很好的例子。 MongoDB不是圍繞關(guān)系數(shù)據(jù)模型和SQL構(gòu)建的遺留應用程序的替代方法。
寫在最后
MongoDB能否“干掉”MySQL,這個問題像是在問非關(guān)系型數(shù)據(jù)庫能否替代關(guān)系型數(shù)據(jù)庫。新的業(yè)務需求推動企業(yè)采用MongoDB作為其應用程序的下一代組件。許多客戶現(xiàn)在享受更高程度的功能和個性化作為一體化的結(jié)果。但大多數(shù)產(chǎn)品最初建立在MySQL上并繼續(xù)運行。目前看來,非關(guān)系型數(shù)據(jù)庫登上王位的路途既長又險。