欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > MongoDb優化指南

MongoDb優化指南

熱門標簽:青白江400企業電話申請 河南電話外呼系統招商 長沙電銷外呼防封卡是什么 外呼線路資源屬于電信業務嗎 呼和浩特外呼系統原理是什么 內蒙古營銷智能外呼系統哪個好 小裙科技電銷機器人怎樣 智能外呼系統官網 crm外呼系統聯系方式

1、為什么選擇MongoDB?

1、性能

在大數據時代中,大數據量的處理已經成了考量一個數據庫最重要的原因之一。而MongoDB的一個主要目標就是盡可能的讓數據庫保持卓越的性能,這很大程度地決定了MongoDB的設計。在一個以傳統機械硬盤為主導的年代,硬盤很可能會成為性能的短板,而MongoDB選擇了最大程度而利用內存資源用作緩存來換取卓越的性能,并且會自動選擇速度最快的索引來進行查詢。MongoDB盡可能精簡數據庫,將盡可能多的操作交給客戶端,這種方式也是MongoDB能夠保持卓越性能的原因之一。

2、擴展

現在互聯網的數據量已經從過去的MB、GB變為了現在的TB級別,單一的數據庫顯然已經無法承受,擴展性成為重要的話題,然而現在的開發人員常常在選擇擴展方式的時候犯了難,到底是選擇橫向擴展還是縱向擴展呢?
橫向擴展(scale out)是以增加分區的方式將數據庫拆分成不同的區塊來分布到不同的機器中來,這樣的優勢是擴展成本低但管理困難。

縱向擴展(scale up) 縱向擴展與橫向擴展不同的是他會將原本的服務器進行升級,讓其擁有更強大的計算能力。這樣的優勢是易于管理無需考慮擴展帶來的眾多問題,但缺點也顯而易見,那就是成本高。一臺大型機的價格往往非常昂貴,并且這樣的升級在數據達到極限時,可能就找不到計算能力更為強大的機器了。

而MongoDB選擇的是更為經濟的橫向擴展,他可以很容易的將數據拆分至不同的服務器中。而且在獲取數據時開發者也無需考慮多服務器帶來的問題,MongoDB可以將開發者的請求自動路由到正確的服務器中,讓開發者脫離橫向擴展帶來的弊病,更專注于程序的開發上。

3、使用

MongoDB采用的是NoSQL的設計方式,可以更加靈活的操作數據。在進行傳統的RDBMS中你一定遇到過幾十行甚至上百行的復雜SQL語句,傳統的RDBMS的SQL語句中包含著大量關聯,子查詢等語句,在增加復雜性的同時還讓性能調優變得更加困難。MongoDB的面向文檔(document-oriented)設計中采用更為靈活的文檔來作為數據模型用來取代RDBMS中的行,面向文檔的設計讓開發人員獲取數據的方式更加靈活,甚至于開發人員僅用一條語句即可查詢復雜的嵌套關系,讓開發人員不必為了獲取數據而絞盡腦汁。

2、NoSQL對傳統數據庫設計思維的影響

1、預設計模式與動態模式

傳統數據庫設計思維中,項目的設計階段需要對數據庫表中的字段名稱、字段類型、進行規定,如果嘗試插入不符合設計的數據,數據庫不會接受這條數據以保證數據的完整性。

--數據庫字段:NAME, SONG

INSERT INTO T_INFO VALUES('John','Come Together'); --成功
INSERT INTO T_INFO VALUES('小明', 20, 'xiaoming@111.com'); --失敗

NoSQL采用的是對集合(類似"表")中的文檔(類似于"行")進行動態追加,在創建集合之初不會對數據類型進行限定,任何文檔都可以追加到任何集合中去,例如我們可以將這樣兩條文檔添加到一個集合中去:

{"name" : "John", "song" : "Come Together"}
{"name" : "小明", "age":"20", "email" : xiaoming@111.com}

MongoDB中文檔的格式類似于我們常見的JSON,由此可見,我們第一個擁有"name"、"song"兩個字段,而第二個擁有"name"、"age"、"email"三個字段,這在預設計模式中的數據庫是不可能插入成功的,但在MongoDB的動態模式是可以的,這樣做的優勢是我們不必為一些數量很少,但種類很多的字段單獨設計一張表,可以將他們集中在單獨一張表進行存儲,但這樣做的弊病也是顯而易見的,我們在獲取數據時需要對同一張表的不同文檔進行區分,增加了開發上的代碼量。所以在設計之初需要權衡動態模式的優劣來選擇表中的數據類型。

2、范式化與反范式化

范式化(normalization)是關系模型的發明者埃德加·科德于1970年提出這一概念,范式化會將數據分散到不同的表中,利用關系模型進行關聯,由此帶來的優點是,在后期進行修改時,不會影響到與其關聯的數據,僅對自身修改即可完成。

反范式化(denormalization)是針對范式化提出的相反理念,反范式化會將當前文檔的數據集中存放在本表中,而不會采用拆分的方式進行存儲。

范式化和反范式化之間不存在優劣的問題,范式化的好處是可以在我們寫入、修改、刪除時的提供更高性能,而反范式化可以提高我們在查詢時的性能。當然NoSQL中是不存在關聯查詢的,以此提高查詢性能,但我們依舊可以以在表中存儲關聯表ID的方式進行范式化。但由此可見,NoSQL的理念中反范式化的地位是大于范式化的。

3、性能與用戶量

“如何能讓軟件擁有更高的性能?”,我想這是一個大部分開發者都思考過的問題。性能往往決定了一個軟件的質量,如果你開發的是一個互聯網產品,那么你的產品性能將更加受到考驗,因為你面對的是廣大的互聯網用戶,他們可不是那么有耐心的。嚴重點說,頁面的加載速度每增加一秒也許都會使你失去一部分用戶,也就是說,加載速度和用戶量是成反比的。那么用戶能夠接受的加載速度到底是多少呢? 

 

如圖,如果頁面加載時間超過10s那么用戶就會離開,如果1s--10s的話就需要有提示,但如果我們的頁面沒有提示的話需要多快的加載速度呢?是的,1s 。

當然,這是站在一個產品經理的角度來說的,但如果站在一個技術人員的角度來說呢?加載速度和用戶量就是成正比的,你的用戶數量越多需要處理的數據當然也就越多,加載速度當然也就越慢。這是一件很有趣的事,所以如果你的產品如果是一件激動人心的產品,那么作為技術人員你需要做的事就是讓軟件的性能和用戶的數量同時增長,甚至性能增長要快于用戶量的增長。

數據庫性能對軟件整體性能的影響是不言而喻的,那么,當我們使用MongoDB時改如何提高數據庫性能呢?

4、范式化與反范式化

在項目設計階段,明確集合的用途是對性能調優非常重要的一步。

從性能優化的角度來看,集合的設計我們需要考慮的是集合中數據的常用操作,例如我們需要設計一個日志(log)集合,日志的查看頻率不高,但寫入頻率卻很高,那么我們就可以得到這個集合中常用的操作是更新(增刪改)。如果我們要保存的是城市列表呢?顯而易見,這個集合是一個查看頻率很高,但寫入頻率很低的集合,那么常用的操作就是查詢。

對于頻繁更新和頻繁查詢的集合,我們最需要關注的重點是他們的范式化程度,在上篇范式化與反范式化的介紹中我們了解到,范式化與反范式化的合理運用對于性能的提高至關重要。然而這種設計的使用非常靈活,假設現在我們需要存儲一篇圖書及其作者,在MongoDB中的關聯就可以體現為以下幾種形式:

1、完全分離(范式化設計)

示例1:

{
   "_id" : ObjectId("5124b5d86041c7dca81917"),
   "title" : "如何使用MongoDB", 
   "author" : [ 
        ObjectId("144b5d83041c7dca84416"),
       ObjectId("144b5d83041c7dca84418"),
       ObjectId("144b5d83041c7dca84420"),
   ]
 }

我們將作者(comment) 的id數組作為一個字段添加到了圖書中去。這樣的設計方式是在非關系型數據庫中常用的,也就是我們所說的范式化設計。在MongoDB中我們將與主鍵沒有直接關系的圖書單獨提取到另一個集合,用存儲主鍵的方式進行關聯查詢。當我們要查詢文章和評論時需要先查詢到所需的文章,再從文章中獲取評論id,最后用獲得的完整的文章及其評論。在這種情況下查詢性能顯然是不理想的。但當某位作者的信息需要修改時,范式化的維護優勢就凸顯出來了,我們無需考慮此作者關聯的圖書,直接進行修改此作者的字段即可。

2、完全內嵌(反范式化設計)

示例2:

{
    "_id" : ObjectId("5124b5d86041c7dca81917"),
    "title" : "如何使用MongoDB",
    "author" : [
        {
               "name" : "丁磊"
               "age" : 40,
               "nationality" : "china",
        },
        {
               "name" : "馬云"
               "age" : 49,
               "nationality" : "china",
        },
        {
               "name" : "張召忠"
               "age" : 59,
               "nationality" : "china",
        },
   ]
 }

在這個示例中我們將作者的字段完全嵌入到了圖書中去,在查詢的時候直接查詢圖書即可獲得所對應作者的全部信息,但因一個作者可能有多本著作,當修改某位作者的信息時時,我們需要遍歷所有圖書以找到該作者,將其修改。

3、部分內嵌(折中方案)

示例3:

{
    "_id" : ObjectId("5124b5d86041c7dca81917"),
    "title" : "如何使用MongoDB",
    "author" : [ 
        {
               "_id" : ObjectId("144b5d83041c7dca84416"),
               "name" : "丁磊"
        },
        {
               "_id" : ObjectId("144b5d83041c7dca84418"),
               "name" : "馬云"
        },
        {
               "_id" : ObjectId("144b5d83041c7dca84420"),
               "name" : "張召忠"
        },
   ]
 }

這次我們將作者字段中的最常用的一部分提取出來。當我們只需要獲得圖書和作者名時,無需再次進入作者集合進行查詢,僅在圖書集合查詢即可獲得。

這種方式是一種相對折中的方式,既保證了查詢效率,也保證的更新效率。但這樣的方式顯然要比前兩種較難以掌握,難點在于需要與實際業務進行結合來尋找合適的提取字段。如同示例3所述,名字顯然不是一個經常修改的字段,這樣的字段如果提取出來是沒問題的,但如果提取出來的字段是一個經常修改的字段(比如age)的話,我們依舊在更新這個字段時需要大范圍的尋找并依此進行更新。

在上面三個示例中,第一個示例的更新效率是最高的,但查詢效率是最低的,而第二個示例的查詢效率最高,但更新效率最低。所以在實際的工作中我們需要根據自己實際的需要來設計表中的字段,以獲得最高的效率。

5、理解填充因子

何為填充因子?

填充因子(padding factor)是MongoDB為文檔的擴展而預留的增長空間,因為MongoDB的文檔是以順序表的方式存儲的,每個文檔之間會非常緊湊,如圖所示。

  (注:圖片出處:《MongoDB The Definitive Guide》)

1.元素之間沒有多余的可增長空間。

2.當我們對順序表中某個元素的大小進行增長的時候,就會導致原來分配的空間不足,只能要求其向后移動。

3.當修改元素移動后,后續插入的文檔都會提供一定的填充因子,以便于文檔頻繁的修改,如果沒有不再有文檔因增大而移動的話,后續插入的文檔的填充因子會依此減小。

填充因子的理解之所以重要,是因為文檔的移動非常消耗性能,頻繁的移動會大大增加系統的負擔,在實際開發中最有可能會讓文檔體積變大的因素是數組,所以如果我們的文檔會頻繁修改并增大空間的話,則一定要充分考慮填充因子。

那么如果我們的文檔是個常常會擴展的話,應該如何提高性能?

兩種方案

1、增加初始分配空間。在集合的屬性中包含一個 usePowerOf2Sizes 屬性,當這個選項為true時,系統會將后續插入的文檔,初始空間都分配為2的N次方。

這種分配機制適用于一個數據會頻繁變更的集合使用,他會給每個文檔留有更大的空間,但因此空間的分配不會像原來那樣高效,如果你的集合在更新時不會頻繁的出現移動現象,這種分配方式會導致寫入速度相對變慢。

2、我們可以利用數據強行將初始分配空間擴大。

db.book.insert({
  "name" : "MongoDB",
  "publishing" : "清華大學出版社",
  "author" : "john"
  "tags" : []
  "stuff" : "ggggggggggggggggggggggggggggggggggggg
        ggggggggggggggggggggggggggggggggggggg
        ggggggggggggggggggggggggggggggggggggg"
})

是的,這樣看起來可能不太優雅...但有時卻很有效!當我們對這個文檔進行增長式修改時,只要將stuff字段刪掉即可。當然,這個stuff字段隨便你怎么起名,包括里邊的填充字符當然也是可以隨意添加的。  

6、準確利用索引

索引對于一個數據庫的影響相信大家一定了解,如果一個查詢命令進入到數據庫中后,查詢優化器沒有找到合適的索引,那么數據庫會進行全集合掃描(在RDBMS中也叫全表掃描),全集合查詢對于性能的影響是災難性的。

沒有索引的查詢就如同在詞典那毫無規律的海量詞匯中獲得某個你想要的詞匯,但這個詞典是沒有目錄的,只能通過逐頁來查找。這樣的查找可能會讓你耗費幾個小時的時間,但如果要求你查詢詞匯的頻率如同用戶訪問的頻率一樣的話。。。嘿嘿,我相信你一定會大喊“老子不干了!”。顯然計算機不會這樣喊,它一直是一個勤勤懇懇的員工,不論多么苛刻的請求他都會完成。所以請通過索引善待你的計算機:D。

在MongoDB中索引的類型與RDBMS中大體一致,我們不做過多重復,我們來看一下在MongoDB中如何才能更高效的利用索引。

6.1 索引越少越好

索引可以極大地提高查詢性能,那么索引是不是越多越好?答案是否定的,并且索引并非越多越好,而是越少越好。每當你建立一個索引時,系統會為你添加一個索引表,用于索引指定的列,然而當你對已建立索引的列進行插入或修改時,數據庫則需要對原來的索引表進行重新排序,重新排序的過程非常消耗性能,但應對少量的索引壓力并不是很大,但如果索引的數量較多的話對于性能的影響可想而知。所以在創建索引時需要謹慎建立索引,要把每個索引的功能都要發揮到極致,也就是說在可以滿足索引需求的情況下,索引的數量越少越好。

隱式索引

//建立復合索引
db.test.ensureIndex({"age": 1,"no": 1,"name": 1 })
我們在查詢時可以迅速的將age,no字段進行排序,隱式索引指的是如果我們想要排序的字段包含在已建立的復合索引中則無需重復建立索引。
db.test.find().sort("age": 1,"no": 1)
db.test.find().sort("age": 1)

如以上兩個排序查詢,均可使用上面的復合索引,而不需要重新建立索引。

翻轉索引

//建立復合索引
db.test.ensureIndex({"age": 1})

翻轉索引很好理解,就是我們在排序查詢時無需考慮索引列的方向,例如這個例子中我們在查詢時可以將排序條件寫為"{'age': 0}",依舊不會影響性能。

6.2 索引列顆粒越小越好

什么叫顆粒越小越好?在索引列中每個數據的重復數量稱為顆粒,也叫作索引的基數。如果數據的顆粒過大,索引就無法發揮該有的性能。例如,我們擁有一個"age"列索引,如果在"age"列中,20歲占了50%,如果現在要查詢一個20歲,名叫"Tom"的人,我們則需要在表的50%的數據中查詢,索引的作用大大降低。所以,我們在建立索引時要盡量將數據顆粒小的列放在索引左側,以保證索引發揮最大的作用。       

總結

以上所述是小編給大家介紹的MongoDb優化指南,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:
  • MongoDB優化心得分享
  • 淺析Mongodb性能優化的相關問題
  • Mongodb索引的優化
  • MongoDB查詢性能優化驗證及驗證
  • MongoDB性能優化及監控
  • 如何對 MongoDB 進行性能優化(五個簡單步驟)

標簽:菏澤 安順 呼倫貝爾 白山 黃石 池州 楚雄 舟山

巨人網絡通訊聲明:本文標題《MongoDb優化指南》,本文關鍵詞  MongoDb,優化,指南,MongoDb,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MongoDb優化指南》相關的同類信息!
  • 本頁收集關于MongoDb優化指南的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲精品日韩专区silk| 亚洲www啪成人一区二区麻豆| 日产国产高清一区二区三区| 免费高清视频在线观看| 永久看片925tv| 国产欧美一区二区精品久导航 | 在线看的片片片免费| 精品国产人成亚洲区| 天天影视涩香欲综合网| 中国xxxx性xxxx产国| 56国语精品自产拍在线观看| 亚洲国产精品一区二区久久| 可以看的av网址| 精品视频1区2区| 亚洲三级小视频| 熟妇无码乱子成人精品| 欧美视频一二三区| 午夜视频一区二区| 亚洲久久久久久| 在线成人高清不卡| 日本在线不卡视频一二三区| 久久久久亚洲av无码专区桃色| 欧美sm美女调教| 国内精品久久久久影院色| 黄色片网站免费| 中文在线一区二区| av综合在线播放| 欧美日韩精品欧美日韩精品一 | 黑人巨大精品一区二区在线| 国产精品国产三级国产aⅴ原创| 成人av在线播放网址| 欧美在线影院一区二区| 亚洲高清免费在线| 亚洲av片不卡无码久久| 久久蜜桃一区二区| 国产成人精品免费在线| 久久久久亚洲av无码专区体验| 亚洲激情图片qvod| 欲求不满的岳中文字幕| 久久综合999| 不卡av在线免费观看| 在线视频欧美精品| 亚洲在线中文字幕| 免费观看av网站| 中文字幕第一页久久| 91原创在线视频| 在线91免费看| 久久av资源站| 一本色道**综合亚洲精品蜜桃冫| 亚洲国产精品一区二区久久恐怖片| 插吧插吧综合网| 天天插天天射天天干| 欧美成人精精品一区二区频| 国产aⅴ综合色| 在线亚洲+欧美+日本专区| 三级久久三级久久久| 色撸撸在线视频| 一区二区三区在线看| a级大片在线观看| 亚洲婷婷国产精品电影人久久| 亚洲色图欧美日韩| 国产午夜精品久久久久久久| 91老师片黄在线观看| 精品国产伦一区二区三区免费| 高清久久久久久| 欧美一二三四在线| 成人激情免费电影网址| 91精品国产高清一区二区三区蜜臀| 国产一区二区三区日韩| 欧美色网一区二区| 国产一区在线视频| 欧美蜜桃一区二区三区| 国产精品一区二区不卡| 欧美精品免费视频| 国产99久久久国产精品| 欧美一区二区三区播放老司机 | 精品国产一区二区精华| 99精品国产视频| 久久精品免视看| 中文字幕天堂网| 亚洲日本青草视频在线怡红院| 88久久精品无码一区二区毛片| 亚洲精品乱码久久久久| 国精产品一区一区| 日韩—二三区免费观看av| www青青草原| 国产乱码一区二区三区| 欧美一区二区久久| 99久久婷婷国产综合精品| 久久久久久久久99精品| 少妇被狂c下部羞羞漫画| 亚洲欧洲精品一区二区精品久久久 | 国产精品影音先锋| 91精品欧美一区二区三区综合在 | 一区二区三区欧美视频| 看黄色录像一级片| 麻豆精品在线看| 欧美理论片在线| 99久久夜色精品国产网站| 无码人妻精品一区二区中文| 亚洲精品视频在线观看免费| 国产3级在线观看| 麻豆精品蜜桃视频网站| 777久久久精品| 黄页网站在线看| 亚洲色图欧洲色图婷婷| www.99re6| 国内成人自拍视频| 欧美xxxxx牲另类人与| 国产a级黄色片| 亚洲午夜一区二区| 欧美性高清videossexo| 成人av电影免费观看| 欧美国产成人在线| 中国特黄一级片| 韩国三级中文字幕hd久久精品| 日韩一级完整毛片| 在线观看成人动漫| 亚洲国产一区二区三区| 色88888久久久久久影院按摩 | 成人一级黄色大片| 国产一区激情在线| 久久免费偷拍视频| www..com.cn蕾丝视频在线观看免费版| 五月婷婷激情综合| 在线播放亚洲一区| 自拍视频一区二区| 日韩在线卡一卡二| 欧美一级黄色大片| 黄色性生活一级片| 日韩电影在线观看电影| 欧美一级片免费看| 一二三不卡视频| 精品影视av免费| 久久久久国产精品麻豆| 貂蝉被到爽流白浆在线观看| 国产精品一色哟哟哟| 日本一区二区在线不卡| 性色国产成人久久久精品| 国产盗摄女厕一区二区三区| 亚洲国产成人午夜在线一区 | 成人欧美一区二区三区黑人麻豆| 久久国产精品国语对白| 成人动漫一区二区在线| 曰韩精品一区二区| 在线播放日韩导航| 欧美做受xxxxxⅹ性视频| 韩国理伦片一区二区三区在线播放| 久久只精品国产| 中文字幕在线观看2018| 99久久精品99国产精品| 亚洲一区在线观看视频| 日韩午夜在线观看| 亚洲欧美va天堂人熟伦| 丰满放荡岳乱妇91ww| 亚洲乱码精品一二三四区日韩在线| 欧美视频三区在线播放| 久久亚洲AV成人无码国产野外| 久久se这里有精品| 一区在线观看免费| 欧美日韩国产大片| 国产av自拍一区| 国v精品久久久网| 亚洲综合在线观看视频| 欧美一级在线观看| 九九热久久免费视频| 99久久精品免费| 水蜜桃久久夜色精品一区的特点| 精品国产一区二区三区四区四| 97精品在线播放| 丰满少妇xbxb毛片日本| 久久狠狠亚洲综合| 17c精品麻豆一区二区免费| 91麻豆精品国产91久久久久| 欧美熟妇激情一区二区三区| 成人av资源网站| 日本不卡中文字幕| 国产日韩av一区二区| 欧美色图片你懂的| 永久免费毛片在线观看| 女人扒开腿免费视频app| 蜜桃av一区二区| 综合久久一区二区三区| 日韩亚洲欧美高清| 欧美风情第一页| 亚洲精品女人久久久| 高清成人在线观看| 日韩中文字幕麻豆| 中文字幕一区二区三中文字幕| 91精品国产综合久久久久久久| 亚洲精品自拍视频在线观看| zjzjzjzjzj亚洲女人| 国产成人免费在线观看| 午夜久久久久久久久| 国产女人18水真多18精品一级做| 538prom精品视频线放| 国产成人无码aa精品一区| 在线观看日韩精品视频| 成人av在线电影| 国内成人免费视频|