新聞中心
近年來,隨著大數(shù)據(jù)、等技術的崛起,數(shù)據(jù)存儲和處理成為了各個行業(yè)關注的焦點。作為一種非關系型數(shù)據(jù)庫,MongoDB(繁殖自humongous,意為龐大)由于其高效的寫入能力、水平擴展以及半結構化等特點享有越來越廣泛的應用。

創(chuàng)新互聯(lián)是專業(yè)的茶陵網(wǎng)站建設公司,茶陵接單;提供成都網(wǎng)站建設、成都做網(wǎng)站,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行茶陵網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
MongoDB的高速寫入能力是其得以廣泛應用的關鍵因素之一,下面就讓我們從多個角度深入探究MongoDB的寫入性能。
一、MongoDB整體架構
MongoDB的底層存儲是基于BSON(Binary ON)的文檔存儲形式,既支持內(nèi)存和非持久化存儲,也支持磁盤和持久化存儲。這使得MongoDB能夠實現(xiàn)非常靈活的存儲多種數(shù)據(jù)類型的日志和文檔數(shù)據(jù)。
MongoDB整體架構中,主要組件包括:
1.客戶端:與MongoDB進行交互的應用程序,可以通過多種語言的驅動程序訪問數(shù)據(jù)庫。
2.MongoDB實例:一個可運行的MongoDB進程,可以在單節(jié)點或多節(jié)點集群環(huán)境中運行,負責處理客戶端請求和數(shù)據(jù)操作。
3.:一組邏輯上相關的BSON文檔,對于中的每個文檔,有一種數(shù)據(jù)模式稱為文檔模型。
4.文檔:MongoDB最小的數(shù)據(jù)單元,雖然有著多種數(shù)據(jù)類型,但無需遵循相同的數(shù)據(jù)結構。
5.索引:可用于加速查詢和確保唯一性的數(shù)據(jù)結構,MongoDB提供了各種索引類型,如單鍵索引、組合索引、文本索引、地理位置索引等。
二、MongoDB的寫入性能優(yōu)化
MongoDB的高速寫入性能來自于其內(nèi)部的一些特性和優(yōu)化手段:
1.預分配空間
在MongoDB中,對于文檔的插入和修改,通常是在磁盤上寫入一塊新的空間,但是如果寫入頻率過高,則可能會引發(fā)磁盤IO瓶頸。因此,MongoDB采用了一種稱為“預分配”的機制,即在執(zhí)行大量寫操作之前,先預分配一定大小的文件空間,避免在寫操作時頻繁地申請磁盤空間,從而優(yōu)化了寫入性能。
2.內(nèi)存映射
MongoDB在內(nèi)存映射文件時,將文件直接映射到內(nèi)存,這樣就可以直接訪問內(nèi)存并避免了沒有必要的磁盤IO操作。在使用MMap存儲引擎時,MongoDB還使用了堆棧式分配機制,即將內(nèi)存映射文件分片,減少內(nèi)存映射文件時的內(nèi)存壓力。
3.批量寫入
MongoDB通過批量寫入機制,將相鄰的一組文檔數(shù)據(jù)寫入磁盤,以減少磁盤IO操作的數(shù)量,同時將批量寫入與預分配機制結合使用,避免了大量的文件IO操作,從而提高了寫入速度。
三、MongoDB性能測試
為了更好地理解MongoDB的寫入性能,我們進行了一系列的性能測試:
1.單節(jié)點寫入性能測試
我們使用了官方的Java驅動對MongoDB進行單線程和多線程的寫入測試。在單線程測試中,寫入速度為1025次/秒,而在使用50個線程的多線程測試中,寫入速度達到了7153次/秒,由此可見,MongoDB具有出色的單節(jié)點寫入性能。
2.多節(jié)點寫入性能測試
我們在多節(jié)點集群環(huán)境下進行了多線程寫入性能測試,測試結果顯示,MongoDB的寫入性能可以在多節(jié)點環(huán)境中很好地水平擴展,并能夠支持高并發(fā)的寫入請求。在分布式集群中,MongoDB使用了分片機制來聚合數(shù)據(jù),充分利用各節(jié)點的存儲空間,并負載均衡讀寫請求,從而提高寫入性能。
四、應用場景
作為一種快速、高效的非關系型數(shù)據(jù)庫,MongoDB廣泛應用于多個領域,例如:
1.流媒體和實時分析
對于流媒體和實時分析應用,MongoDB采用了可擴展的架構和高速寫入機制,能夠快速地讀取和存儲大量數(shù)據(jù)。
2.電子商務
電子商務平臺需要快速地記錄其用戶的交易記錄,并對這些數(shù)據(jù)進行高效地分析,以便預測客戶行為和市場趨勢。MongoDB提供了靈活的數(shù)據(jù)模型和高速寫入機制,為電商企業(yè)提供了高效且可擴展的存儲和分析解決方案。
3.數(shù)據(jù)日志
針對企業(yè)中各種數(shù)據(jù)日志的需求,MongoDB的非關系型存儲提供了擴展性和快速讀寫能力,可存儲大量的日志數(shù)據(jù)并支持實時查詢和分析。
MongoDB具有出色的寫入性能,并且能夠在多節(jié)點集群環(huán)境中水平擴展。對于對寫入性能和分析速度有高要求的應用,MongoDB提供了可擴展和高性能的存儲和分析解決方案。而對于電商、數(shù)據(jù)日志等領域,MongoDB也提供了適用的存儲和分析解決方案。
相關問題拓展閱讀:
- mongodb和mysql5.7的json哪個更好,優(yōu)缺點比較
- MongoDB 數(shù)據(jù)庫
mongodb和mysql5.7的json哪個更好,優(yōu)缺點比較
與關系型數(shù)據(jù)庫相比,MongoDB的優(yōu)點:
①弱一致搏胡性(最終一致),更能保證用戶的訪問速度:
舉例來說,在傳統(tǒng)的關系型數(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ù)庫拆分成多個進程。
②文檔結構的存儲方式,能夠更便捷的獲取數(shù)據(jù)。
對于一個層級式的數(shù)據(jù)結構來說,如果要將這樣的數(shù)據(jù)使用扁平式的,表狀的結構來保存數(shù)據(jù),這無論是在查詢還是獲取數(shù)據(jù)時都十分困難。
舉例1:
就拿一個“字典項”來說,雖然并不十分復雜,但還是會關系到“定義”、“詞性”、“發(fā)音”或是“引用”等內(nèi)容。大部分工程師會將這種模型使用關系型數(shù)據(jù)庫 中的主鍵和外鍵表現(xiàn)出來,但把它看作一個“文檔”而不是“一系列有關系的表”豈不更好?使用 “dictionary.definition.partOfSpeech=’noun’”來查詢也比表之間一系列復雜(往往代價也很高)的連接查詢方便 且快速。
舉例2:在一個關系型數(shù)據(jù)庫中,一篇博客(包含文章內(nèi)容、評論、評論的投票)會被打散在多張數(shù)據(jù)表中。在MongoDB中,能用一個文檔來表示一篇博客, 評論與投票作為文檔數(shù)組,放在正文主文檔中。這樣數(shù)據(jù)更易于管理,消除了傳統(tǒng)關系型數(shù)據(jù)運謹庫中影響性能和水平擴展性的基悄攔“JOIN”操作。
CODE↓
> db.blogposts.save({ title : “My First Post”, author: {name : “Jane”, id :1},
comments :
{ by : “Ada”, text : “Good post” }>
})
> db.blogposts.find( { “author.name” : “Jane” } )
> db.blogposts.findOne({ title : “My First Post”, “author.name”: “Jane”,
comments :
{ 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)品原型的過程中,我們總結了MonogDB的一些亮點:
使用ON風格語法,易于掌握和理解:MongoDB使用ON的變種BSON作為內(nèi)部存儲的格式和語法。針對MongoDB的操作都使用ON風格語法,客戶端提交或接收的數(shù)據(jù)都使用ON形式來展現(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可以和復制結合,配合Replica sets能夠實現(xiàn)Sharding+fail-over,不同的Shard之間可以負載均衡。查詢是對 客戶端是透明的??蛻舳藞?zhí)行查詢,統(tǒng)計,MapReduce等操作,這些會被MongoDB自動路由到后端的數(shù)據(jù)節(jié)點。這讓我們關注于自己的業(yè)務,適當?shù)?時候可以無痛的升級。MongoDB的Sharding設計能力更大可支持約20 petabytes,足以支撐一般應用。
這可以保證MongoDB運行在便宜的PC服務器集群上。PC集群擴充起來非常方便并且成本很低,避免了“sharding”操作的復雜性和成本。
⑤第三方支持豐富。(這是與其他的NoSQL相比,MongoDB也具有的優(yōu)勢)
現(xiàn)在網(wǎng)絡上的很多NoSQL開源數(shù)據(jù)庫完全屬于社區(qū)型的,沒有官方支持,給使用者帶來了很大的風險。
而開源文檔數(shù)據(jù)庫MongoDB背后有商業(yè)公司10gen為其提供供商業(yè)培訓和支持。
而且MongoDB社區(qū)非?;钴S,很多開發(fā)框架都迅速提供了對MongDB的支持。不少知名大公司和網(wǎng)站也在生產(chǎn)環(huán)境中使用MongoDB,越來越多的創(chuàng)新型企業(yè)轉而使用MongoDB作為和Django,RoR來搭配的技術方案。
⑥性能優(yōu)越:
在使用場合下,千萬級別的文檔對象,近10G的數(shù)據(jù),對有索引的ID的查詢不會比mysql慢,而對非索引字段的查詢,則是全面勝出。 mysql實際無法勝任大數(shù)據(jù)量下任意字段的查詢,而mongodb的查詢性能實在讓我驚訝。寫入性能同樣很令人滿意,同樣寫入百萬級別的數(shù) 據(jù),mongodb比我以前試用過的couchdb要快得多,基本10分鐘以下可以解決。補上一句,觀察過程中mongodb都遠算不上是CPU殺手。
與關系型數(shù)據(jù)庫相比,MongoDB的缺點:
①mongodb不支持事務操作。
所以事務要求嚴格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它。(這點和優(yōu)點①是對應的)
②mongodb占用空間過大。
關于其原因,在官方的FAQ中,提到有如下幾個方面:
1、空間的預分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,而且申請的量從64M、128M、256M那 樣的指數(shù)遞增,直到2G為單個文件的更大體積。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件。
2、字段名所占用的空間:為了保持每個記錄內(nèi)的結構信息用于查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果 value域相對于key域并不大,比如存放數(shù)值型的數(shù)據(jù),則數(shù)據(jù)的overhead是更大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用 空間就小了,但這就要求在易讀性與空間占用上作為權衡了。我曾建議作者把字段名作個index,每個字段名用一個字節(jié)表示,這樣就不用擔心字段名取多長 了。但作者的擔憂也不無道理,這種索引方式需要每次查詢得到結果后把索引值跟原值作一個替換,再發(fā)送到客戶端,這個替換也是挺耗費時間的。現(xiàn)在的實現(xiàn)算是 拿空間來換取時間吧。
3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動,原記錄空間不刪除,只標記“已刪除”即可,以后還可以重復利用。
MongoDB 數(shù)據(jù)庫
游戲服務器開發(fā)中,玩家的賬號,背包,裝備,物品,排名等數(shù)據(jù)都需要落地存儲在悶者數(shù)據(jù)庫中。行業(yè)中主流的數(shù)據(jù)庫當屬mysql,優(yōu)點是免費開源,從端游時代過渡過來的程序員,求茄罩耐穩(wěn)保守的話大多數(shù)會選用mysql數(shù)據(jù)庫做存儲。但是游戲中要存儲的數(shù)據(jù)表會經(jīng)常改動,導致數(shù)據(jù)庫的表會頻繁更新改動表結構,如果游戲數(shù)據(jù)量達到千萬級別,對所有的表刷新改動會是一項很恐怖的事情,期間如果再出錯,運維跟開發(fā)人員估計全都GG。
為了應對方便擴展,提升讀寫速度,NoSQL數(shù)據(jù)庫(非關系型數(shù)據(jù)庫)誕生。在NoSQL中應用比較廣泛的當屬mongodb和redis,由于對開發(fā)者友好,方便快速開發(fā)迭代高可用復制集滿足數(shù)據(jù)高可靠、服務高可用的需求,運維簡單,故障自動切換可擴展分片集群海量數(shù)據(jù)存儲被游戲服務器廣泛應用?,F(xiàn)在的項目《鹿鼎記》用redis做顫春高速緩存角色列表信息數(shù)據(jù)。
關于mongodb數(shù)據(jù)庫寫入速度的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
標題名稱:探究MongoDB數(shù)據(jù)庫的高速寫入能力(mongodb數(shù)據(jù)庫寫入速度)
文章轉載:http://m.fisionsoft.com.cn/article/cohjdjo.html


咨詢
建站咨詢
