溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何優(yōu)化Mongodb 數(shù)據(jù)庫

發(fā)布時間:2021-06-18 17:59:11 來源:億速云 閱讀:139 作者:Leah 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)如何優(yōu)化Mongodb 數(shù)據(jù)庫,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

數(shù)據(jù)庫設(shè)計優(yōu)化

在項目設(shè)計階段,明確集合的用途是對性能調(diào)優(yōu)非常重要的一步。

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

對于頻繁更新和頻繁查詢的集合,我們最需要關(guān)注的重點是他們的范式化程度,假設(shè)現(xiàn)在我們需要存儲一篇圖書及其作者,在MongoDB中的關(guān)聯(lián)就可以體現(xiàn)為以下幾種形式:

1.完全分離(范式化設(shè)計)

示例1:

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

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

2.完全內(nèi)嵌(反范式化設(shè)計)

示例2:

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

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

3.部分內(nèi)嵌(折中方案)

示例3:

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

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

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

關(guān)于如何優(yōu)化Mongodb 數(shù)據(jù)庫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI