一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

mongodb與mysql相比的優(yōu)缺點(轉(zhuǎn))

 博雅書屋lhs 2016-05-03

與關(guān)系型數(shù)據(jù)庫相比,MongoDB的優(yōu)點:
①弱一致性(最終一致),更能保證用戶的訪問速度:
舉例來說,在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中,一個COUNT類型的操作會鎖定數(shù)據(jù)集,這樣可以保證得到“當前”情況下的精確值。這在某些情況下,例 如通過ATM查看賬戶信息的時候很重要,但對于Wordnik來說,數(shù)據(jù)是不斷更新和增長的,這種“精確”的保證幾乎沒有任何意義,反而會產(chǎn)生很大的延 遲。他們需要的是一個“大約”的數(shù)字以及更快的處理速度。

但某些情況下MongoDB會鎖住數(shù)據(jù)庫。如果此時正有數(shù)百個請求,則它們會堆積起來,造成許多問題。我們使用了下面的優(yōu)化方式來避免鎖定:
每次更新前,我們會先查詢記錄。查詢操作會將對象放入內(nèi)存,于是更新則會盡可能的迅速。在主/從部署方案中,從節(jié)點可以使用“-pretouch”參數(shù)運行,這也可以得到相同的效果。 
使用多個mongod進程。我們根據(jù)訪問模式將數(shù)據(jù)庫拆分成多個進程。 
②文檔結(jié)構(gòu)的存儲方式,能夠更便捷的獲取數(shù)據(jù)。
對于一個層級式的數(shù)據(jù)結(jié)構(gòu)來說,如果要將這樣的數(shù)據(jù)使用扁平式的,表狀的結(jié)構(gòu)來保存數(shù)據(jù),這無論是在查詢還是獲取數(shù)據(jù)時都十分困難。
舉例1:
就拿一個“字典項”來說,雖然并不十分復(fù)雜,但還是會關(guān)系到“定義”、“詞性”、“發(fā)音”或是“引用”等內(nèi)容。大部分工程師會將這種模型使用關(guān)系型數(shù)據(jù)庫 中的主鍵和外鍵表現(xiàn)出來,但把它看作一個“文檔”而不是“一系列有關(guān)系的表”豈不更好?使用 “dictionary.definition.partOfSpeech='noun'”來查詢也比表之間一系列復(fù)雜(往往代價也很高)的連接查詢方便 且快速。

舉例2:在一個關(guān)系型數(shù)據(jù)庫中,一篇博客(包含文章內(nèi)容、評論、評論的投票)會被打散在多張數(shù)據(jù)表中。在MongoDB中,能用一個文檔來表示一篇博客, 評論與投票作為文檔數(shù)組,放在正文主文檔中。這樣數(shù)據(jù)更易于管理,消除了傳統(tǒng)關(guān)系型數(shù)據(jù)庫中影響性能和水平擴展性的“JOIN”操作。

CODE↓
> db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1},
  comments : [{ by: "Abe", text: "First" },
              { by : "Ada", text : "Good post" }]
})

> db.blogposts.find( { "author.name" : "Jane" } )

> db.blogposts.findOne({ title : "My First Post", "author.name": "Jane",
  comments : [{ by: "Abe", text: "First" },
              { by : "Ada", text : "Good post" } ]
})
> db.blogposts.find( { "comments.by" : "Ada" } )

> db.blogposts.ensureIndex( { "comments.by" : 1 } );
舉例③:
MongoDB是一個面向文檔的數(shù)據(jù)庫,目前由10gen開發(fā)并維護,它的功能豐富,齊全,完全可以替代MySQL。在使用MongoDB做產(chǎn)品原型的過程中,我們總結(jié)了MonogDB的一些亮點:
使用JSON風格語法,易于掌握和理解:MongoDB使用JSON的變種BSON作為內(nèi)部存儲的格式和語法。針對MongoDB的操作都使用JSON風格語法,客戶端提交或接收的數(shù)據(jù)都使用JSON形式來展現(xiàn)。相對于SQL來說,更加直觀,容易理解和掌握。
Schema-less,支持嵌入子文檔:MongoDB是一個Schema-free的文檔數(shù)據(jù)庫。一個數(shù)據(jù)庫可以有多個Collection,每 個Collection是Documents的集合。Collection和Document和傳統(tǒng)數(shù)據(jù)庫的Table和Row并不對等。無需事先定義 Collection,隨時可以創(chuàng)建。
Collection中可以包含具有不同schema的文檔記錄。 這意味著,你上一條記錄中的文檔有3個屬性,而下一條記錄的文檔可以有10個屬 性,屬性的類型既可以是基本的數(shù)據(jù)類型(如數(shù)字、字符串、日期等),也可以是數(shù)組或者散列,甚至還可以是一個子文檔(embed document)。這 樣,可以實現(xiàn)逆規(guī)范化(denormalizing)的數(shù)據(jù)模型,提高查詢的速度。


③內(nèi)置GridFS,支持大容量的存儲。
  GridFS是一個出色的分布式文件系統(tǒng),可以支持海量的數(shù)據(jù)存儲。
  內(nèi)置了GridFS了MongoDB,能夠滿足對大數(shù)據(jù)集的快速范圍查詢。
④內(nèi)置Sharding。
提供基于Range的Auto Sharding機制:一個collection可按照記錄的范圍,分成若干個段,切分到不同的Shard上。
Shards可以和復(fù)制結(jié)合,配合Replica sets能夠?qū)崿F(xiàn)Sharding+fail-over,不同的Shard之間可以負載均衡。查詢是對 客戶端是透明的??蛻舳藞?zhí)行查詢,統(tǒng)計,MapReduce等操作,這些會被MongoDB自動路由到后端的數(shù)據(jù)節(jié)點。這讓我們關(guān)注于自己的業(yè)務(wù),適當?shù)?時候可以無痛的升級。MongoDB的Sharding設(shè)計能力最大可支持約20 petabytes,足以支撐一般應(yīng)用。
這可以保證MongoDB運行在便宜的PC服務(wù)器集群上。PC集群擴充起來非常方便并且成本很低,避免了“sharding”操作的復(fù)雜性和成本。

⑤第三方支持豐富。(這是與其他的NoSQL相比,MongoDB也具有的優(yōu)勢)
現(xiàn)在網(wǎng)絡(luò)上的很多NoSQL開源數(shù)據(jù)庫完全屬于社區(qū)型的,沒有官方支持,給使用者帶來了很大的風險。
而開源文檔數(shù)據(jù)庫MongoDB背后有商業(yè)公司10gen為其提供供商業(yè)培訓(xùn)和支持。
而且MongoDB社區(qū)非?;钴S,很多開發(fā)框架都迅速提供了對MongDB的支持。不少知名大公司和網(wǎng)站也在生產(chǎn)環(huán)境中使用MongoDB,越來越多的創(chuàng)新型企業(yè)轉(zhuǎn)而使用MongoDB作為和Django,RoR來搭配的技術(shù)方案。
⑥性能優(yōu)越:
在使用場合下,千萬級別的文檔對象,近10G的數(shù)據(jù),對有索引的ID的查詢不會比mysql慢,而對非索引字段的查詢,則是全面勝出。 mysql實際無法勝任大數(shù)據(jù)量下任意字段的查詢,而mongodb的查詢性能實在讓我驚訝。寫入性能同樣很令人滿意,同樣寫入百萬級別的數(shù) 據(jù),mongodb比我以前試用過的couchdb要快得多,基本10分鐘以下可以解決。補上一句,觀察過程中mongodb都遠算不上是CPU殺手。


與關(guān)系型數(shù)據(jù)庫相比,MongoDB的缺點:
①mongodb不支持事務(wù)操作。
  所以事務(wù)要求嚴格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它。(這點和優(yōu)點①是對應(yīng)的)
②mongodb占用空間過大。
  關(guān)于其原因,在官方的FAQ中,提到有如下幾個方面:
1、空間的預(yù)分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,而且申請的量從64M、128M、256M那 樣的指數(shù)遞增,直到2G為單個文件的最大體積。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件。

2、字段名所占用的空間:為了保持每個記錄內(nèi)的結(jié)構(gòu)信息用于查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果 value域相對于key域并不大,比如存放數(shù)值型的數(shù)據(jù),則數(shù)據(jù)的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用 空間就小了,但這就要求在易讀性與空間占用上作為權(quán)衡了。我曾建議作者把字段名作個index,每個字段名用一個字節(jié)表示,這樣就不用擔心字段名取多長 了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結(jié)果后把索引值跟原值作一個替換,再發(fā)送到客戶端,這個替換也是挺耗費時間的?,F(xiàn)在的實現(xiàn)算是 拿空間來換取時間吧。

3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動,原記錄空間不刪除,只標記“已刪除”即可,以后還可以重復(fù)利用。

4、可以定期運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢

③MongoDB沒有如MySQL那樣成熟的維護工具,這對于開發(fā)和IT運營都是個值得注意的地方。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产传媒一区二区三区| 国产综合一区二区三区av| 成年人视频日本大香蕉久久| 久久精品国产第一区二区三区 | 成年女人午夜在线视频| 国产一区麻豆水好多高潮| 精品久久少妇激情视频| 日本不卡一区视频欧美| 午夜日韩在线观看视频| 国产乱人伦精品一区二区三区四区 | 日本在线不卡高清欧美| 日本不卡在线一区二区三区| 亚洲综合天堂一二三区| 中国一区二区三区人妻| 午夜精品福利视频观看| 日韩成人动作片在线观看| 日韩在线中文字幕不卡| 欧美日韩中黄片免费看| 国产91色综合久久高清| 中文字幕精品一区二区年下载| 精品人妻一区二区三区四区久久| 色小姐干香蕉在线综合网| 亚洲精品成人福利在线| 日韩一区二区三区有码| 国产精品欧美一级免费| 四季av一区二区播放| 欧美日本道一区二区三区| 99国产成人免费一区二区| 国产福利一区二区三区四区| 日韩高清中文字幕亚洲| 欧美国产亚洲一区二区三区| 亚洲清纯一区二区三区| 高清不卡视频在线观看| 草草视频精品在线观看| 国产精品免费自拍视频| 欧美日韩国产二三四区| 中文字幕人妻综合一区二区 | 日韩一级毛一欧美一级乱| 欧美成人国产精品高清| 国产精品成人免费精品自在线观看 | 亚洲熟妇熟女久久精品 |