最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談MongoDB內(nèi)部的存儲原理

 更新時間:2023年07月04日 08:53:40   作者:數(shù)據(jù)知道  
這篇文章主要介紹了淺談MongoDB內(nèi)部的存儲原理,MongoDB是一個面向文檔的數(shù)據(jù)庫系統(tǒng)。使用C++編寫,不支持SQL,但有自己功能強大的查詢語法,需要的朋友可以參考下

存儲引擎

本文介紹默認存儲引擎WiredTiger

WiredTiger架構(gòu)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-m6gvgNNr-1657024774196)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1226)]

WiredTiger的寫操作會先寫入Cache,并持久化到WAL(Write ahead log),每60s會做一次Checkpoint,將當(dāng)前的數(shù)據(jù)持久化,每,產(chǎn)生一個新的快照。Wiredtiger連接初始化時,首先將數(shù)據(jù)恢復(fù)至最新的快照狀態(tài),然后根據(jù)Checkpoint恢復(fù)數(shù)據(jù),以保證存儲可靠性

btree與b+tree

雖然遍歷數(shù)據(jù)的查詢是相對常見的,但是 MongoDB 認為查詢單個數(shù)據(jù)記錄遠比遍歷數(shù)據(jù)更加常見,由于 B 樹的非葉結(jié)點也可以存儲數(shù)據(jù),所以 查詢一條數(shù)據(jù)所需要的平均隨機 IO 次數(shù)會比 B+ 樹少,使用 B 樹的 MongoDB 在類似場景中的查詢速度就會比 MySQL 快。

這里并不是說 MongoDB 并不能對數(shù)據(jù)進行遍歷,我們在 MongoDB 中也可以使用范圍來查詢一批滿足對應(yīng)條件的記錄,只是需要的時間會比 MySQL 長一些。MySQL 認為遍歷數(shù)據(jù)的查詢是常見的,所以它選擇 B+ 樹作為底層數(shù)據(jù)結(jié)構(gòu)

cache

內(nèi)部緩存和文件系統(tǒng)緩存,默認情況下內(nèi)部緩存取50%(RAM-1 GB)或256M較大者,文件系統(tǒng)緩存使用所有當(dāng)前可用的RAM。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-f6pKa5SR-1657024774197)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1227)]

Wiredtiger的Cache采用Btree的方式組織,每個Btree節(jié)點為一個page,root page是btree的根節(jié)點,internal page是btree的中間索引節(jié)點,leaf page是真正存儲數(shù)據(jù)的葉子節(jié)點;btree的數(shù)據(jù)以page為單位按需從磁盤加載或?qū)懭氪疟P,btree的每個page以文件里的extent形式(由文件offset + size標(biāo)識)存儲

page

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MUI3Noms-1657024774198)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1228)]

ROW_ARRAY: 每個數(shù)組單元(wt_row)存儲的是這個 kv row 在存儲在磁盤上的 page kv cell 行集合數(shù)據(jù)緩沖區(qū)偏移的位置和編碼方式(這個位置和編碼方式在 WT 上定義成一個 wt_cell 對象),通過這個信息偏移位置信息就可以訪問到這一樣在緩沖區(qū)中的 K/V 內(nèi)容值 ROW_UPDATE_ARRAY: 一個 mvcc list 對象,mvcc_list 與 wt_row 是一一對應(yīng)的,mvcc list 當(dāng)中存儲對 wt_row 修改的值,修改的值包括值更新和值刪除,是一個無鎖單向鏈表

寫操作 遍歷btree,找到需要更新的page如果cache中沒有對應(yīng)的page,會從磁盤中加載page,鍵值對存入WT_ROW如果是insert操作,更新WT_INSERT,如果是update/delete操作,更新WT_UPDATE如果需要,將操作記錄寫入journal

我們通過一個實例來說明: 假如一個 page 存儲了一個 [0,100] 的 key 范圍,磁盤上原來存儲的行 key=2, 10 ,20, 30 , 50, 80, 90,他們的值分別是value = 102, 110, 120, 130, 150, 180, 190。 在 page 數(shù)據(jù)從磁盤讀到內(nèi)存后,分別對 key=2 的 value 進行了兩次修改,兩次修改的值是分別 402,502。對 key = 20 ,50 的 value 做了一次修改,修改后的 value = 122, 155,后有分配 insert 了新的 key = 3,5, 41, 99,value = 203,205,241,299。 那么在內(nèi)存中的 page 就是如下圖組織數(shù)據(jù)的:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ew70Kjzs-1657024774198)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1229)]

相鄰的兩 wt_row 之間可能不是連續(xù)的,他們之間可以插入新的單元,例如 row1(key = 2) 和 row2(key=10) 可以插入 3 和 5,這兩個 row 之間需要有一個排序的數(shù)據(jù)結(jié)構(gòu)(WT用 skiplist 數(shù)據(jù)結(jié)構(gòu))來存儲插入的 K/V,就需要一個 skiplist 對象數(shù)組 page_insert_array與row array對應(yīng)。這里需要說明的是 圖6 當(dāng)中紅色框當(dāng)中的 skiplist8,它是用于存儲 row1(key=2) 范圍之前的 insert 數(shù)據(jù),圖中如果有 key =1 的數(shù)據(jù) insert,那么這個數(shù)據(jù)會新增到 skiplist8 當(dāng)中。

那么圖中row與 insert skiplist 的對應(yīng)關(guān)系就是:

row1 之前的范圍對應(yīng) insert 是 skiplist8row1 和 row2之間對應(yīng)的 insert 是 skiplist1row2 和 row3之間對應(yīng)的 insert 是 skiplist3…row7 之后的范圍對應(yīng)的 insert 是 skiplist7 checkpoint

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FAoNj9By-1657024774199)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1230)]

一個Checkpoit包含如下元數(shù)據(jù): root page地址,地址由文件offset,size及內(nèi)容的checksum組成 alloc extent list地址,存儲從上次checkpoint起新分配的extent列表 discard extent list地址,存儲從上次checkpoint起丟棄的extent列表 available extent list地址,存儲可分配的extent列表,只有最新的checkpoint包含該列表 file size 如需恢復(fù)到該checkpoint的狀態(tài),將文件truncate到file size即可

WAL(journal)

日志文件記錄的是從上一個checkpoint之后的實際操作,該文件每100ms或文件大小到達100M就從緩存同步到磁盤

整體關(guān)系

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MVHYqJxR-1657024774199)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1231)]

分布式存儲

架構(gòu)

架構(gòu)圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oFTkWPep-1657024774200)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1232)]

寫數(shù)據(jù)流程:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LBfsoU1L-1657024774200)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1233)]

讀數(shù)據(jù)流程:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IDG49n7y-1657024774201)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1234)]

到此這篇關(guān)于淺談MongoDB內(nèi)部的存儲原理的文章就介紹到這了,更多相關(guān)MongoDB存儲原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mongodb eval 執(zhí)行服務(wù)器端腳本

    mongodb eval 執(zhí)行服務(wù)器端腳本

    在MongoDB的服務(wù)器端可以通過db.eval函數(shù)來執(zhí)行javascript腳本,如我們可以定義一個javascript函數(shù),然后通過db.eval在服務(wù)器端來運行!我們前面其實也接觸過在服務(wù)器段運行一個預(yù)定義的javascript腳本的情況,如在$where查詢,執(zhí)行mapreduce任務(wù)等。
    2015-05-05
  • Mongodb數(shù)組字段索引之多鍵索引

    Mongodb數(shù)組字段索引之多鍵索引

    Mongodb字段允許包含字符,文檔,數(shù)組等各種各樣的類型,同樣Mongodb索引也可以支持字符,文檔,數(shù)組等類型,本文結(jié)合Mongodb官方文檔,介紹Mongodb數(shù)組類型數(shù)據(jù)的索引——多鍵索引,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • MongoDB如何對數(shù)組中的元素進行查詢詳解

    MongoDB如何對數(shù)組中的元素進行查詢詳解

    MongoDB在文檔上支持?jǐn)?shù)組,其次數(shù)組上可以實現(xiàn)嵌套,以及數(shù)組元素也可以文檔。所以下面這篇文章主要給大家介紹了關(guān)于MongoDB如何對數(shù)組中元素進行查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • MongoDB事務(wù)的限制和注意事項詳解

    MongoDB事務(wù)的限制和注意事項詳解

    MongoDB事務(wù)提供了ACID特性,但存在復(fù)制集和分片集群要求、超時限制、鎖限制、事務(wù)大小限制和跨集合/數(shù)據(jù)庫限制等,本文介紹MongoDB事務(wù)的限制和注意事項,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • MongoDB常用數(shù)據(jù)類型分享

    MongoDB常用數(shù)據(jù)類型分享

    這篇文章主要介紹了MongoDB常用數(shù)據(jù)類型,???JSON是一種簡單的數(shù)據(jù)表示方式,它易于理解、易于解析、易于記憶,?BSON是一種類JSON的二進制形式的存儲格,更多類型需要的小伙伴可以參考下文詳細介紹
    2022-04-04
  • MongoDB客戶端工具NoSQL?Manager?for?MongoDB介紹

    MongoDB客戶端工具NoSQL?Manager?for?MongoDB介紹

    這篇文章介紹了MongoDB客戶端工具NoSQL?Manager?for?MongoDB,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • MongoDB中UPDATE操作$pullAll的方法

    MongoDB中UPDATE操作$pullAll的方法

    與$pull有所不同,$pull操作通過指定一個查詢條件或單個值來刪除數(shù)組中的元素, 而$pullAll刪除所有在指定列表中的數(shù)組元素,本文介紹Mongodb UPDATE操作中的$pullAll, 用來從數(shù)組中刪除多個元素,感興趣的朋友一起看看吧
    2024-06-06
  • MongoDB?插入操作機制詳解之insert()?與?nInserted?的行為剖析(推薦)

    MongoDB?插入操作機制詳解之insert()?與?nInserted?的行為剖析(推薦)

    本文將以一段常見的MongoDB?Shell腳本為切入點,深入探討insert()?方法的工作機制、返回值含義,并對比insertMany()的差異,幫助開發(fā)者避免常見誤解,寫出更高效、更可控的數(shù)據(jù)寫入代碼,感興趣的朋友一起看看吧
    2025-11-11
  • MongoDB系列教程(一):NoSQL起源

    MongoDB系列教程(一):NoSQL起源

    這篇文章主要介紹了MongoDB系列教程(一):NoSQL起源,本文講解了為什么出現(xiàn)NoSQL、NoSQL歷史、SQL和NoSql的區(qū)別、NoSQL數(shù)據(jù)庫類型等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • MongoDB設(shè)置登錄賬號、密碼及權(quán)限的詳細過程

    MongoDB設(shè)置登錄賬號、密碼及權(quán)限的詳細過程

    這篇文章主要給大家介紹了關(guān)于MongoDB設(shè)置登錄賬號、密碼及權(quán)限的詳細過程,文中通過代碼以及圖文介紹的非常詳細,對大家學(xué)習(xí)或者使用MongoDB具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09

最新評論

友谊县| 汶川县| 唐山市| 新兴县| 瑞安市| 衡南县| 健康| 开鲁县| 木兰县| 邓州市| 荆门市| 湘潭市| 托里县| 申扎县| 盐津县| 高州市| 巩留县| 榆林市| 织金县| 南雄市| 芦溪县| 锦州市| 景东| 色达县| 中山市| 高邮市| 囊谦县| 体育| 教育| 叙永县| 宁国市| 宁夏| 龙泉市| 泾阳县| 寻乌县| 安徽省| 渭南市| 宁波市| 乃东县| 虎林市| 嘉禾县|