存儲引擎主要負責管理數據如何存儲在硬盤和內存上。mysql
mongoDB3.2版本以後選擇了wiredTiger做爲默認存儲引擎,查看數據庫存儲引擎語句以下:sql
db.serverStatus()
複製代碼
wiredTiger經過Btree管理數據,B樹的數據結構以下圖。數據庫
1.MongoDB自己不支持事務實現,可是wiredTiger存儲引擎能夠經過事務快照和併發控制技術實現事務及ACID。緩存
2.Wiredtiger採用Copy on write的方式管理修改操做(insert、update、delete),修改操做會先緩存在cache裏,持久化時,修改操做不會在原來的leaf page上進行,而是寫入新分配的page,每次checkpoint都會產生一個新的root page。
Checkpoint時,wiredtiger須要將btree修改過的PAGE都進行持久化存儲數據結構
3.大部分數據庫採用的都是硬盤級索引,即MongoDB中每一個Btree節點爲一個page單位,其中在數據查找的過程當中,Btree結點上的數據須要以page爲單位從硬盤中加載到內存中,或者從內存中寫入硬盤;
4.mongoDB是文檔級數據存儲,數據存儲結構簡單,通常使用的需求都是IO次數少併發
對於mysql來講,B+樹的根節點和支結點不用存儲數據區域mvc
1.B+樹的存儲結構是這樣的,每一個節點保存的是關鍵字和指向下一個節點的指針; 2.和b tree 兩個明顯的區別就是,第一個是非葉子節點不保存數據區域,第二點是有左閉合區間,講一下數據規則;app
聊一下MongoDB和mysql的對比 1.Mysql關係型數據庫—須要範圍查詢 MongoDB 文檔級別 不須要範圍查詢性能
2.mongoDB通常在設計的時候都是儘量的減小磁盤與硬盤之間的IO來提升性能;而Btree恰好是數據與關鍵字存放在同一個結點,因此mongoDB使用btreespa
1.首先是這樣每一個結點保存的關鍵字個數更多
2.每一個結點加載到內存中,若是不是葉子節點,就不用進行掃庫操做,若是是b樹,每次讀寫到內存的時候都須要掃庫;
3.B+ tree的葉子節點是以鏈表的時候把每一個點連在一塊兒,他們存儲是有序的,可使用範圍查詢
4.mongoDB通常在設計的時候都是儘量的減小磁盤與硬盤之間的IO來提升性能;而Btree恰好是數據與關鍵字存放在同一個結點,因此mongoDB使用btree
MongoDB不只能將數據持久化存儲到硬盤文件中,並且還能將數據只保存到內存中;
而後不一樣的存儲引擎的區別就是使用了不一樣的存儲機制,鎖定技術,或者是索引技術等等;而後他們的性能也不同, WT實現事務須要用到這三個關鍵的技術:
Snapshot,MVCC Redo log;
定義了一個事務的總體全局對象wt_transaction,裏面包括id MVCC 多版本併發控制,基於keyvalue的value值的鏈表,主要是在鏈表裏存儲事務id 和本次事務下操做所修改的值。
WT 引擎中的 snapshot_oject 是有一個最小執行事務 snap_min、一個最大事務 snap max 和一個處於 [snap_min, snap_max] 區間之中全部正在執行的寫事務序列組成。若是上圖在 T6 時刻對系統中的事務作一次 snapshot,那麼產生的T6 能訪問的事務修改有兩個區間:全部小於 T1 事務的修改 [0, T1) 和 [snap_min, snap_max] 區間已經提交的事務 T2 的修改。換句話說,凡是出如今 snap_array 中或者事務 ID 大於 snap_max 的事務的修改對事務 T6 是不可見的。若是 T1 在創建 snapshot 以後提交了,T6 也是不能訪問到 T1 的修改。這個就是 snapshot 方式隔離的基本原理。
若是有人從數據庫中讀數據,有另外的人寫入數據,有可能讀數據的人看到的數據是不完整的,不一樣數據庫提出了不少方法來解決這個問題,解決這個問題的方法叫併發控制方法;
解決:mysql數據庫中對這個問題的解決方案是加鎖,經過加鎖,讓全部讀的用戶都等寫用戶工做完成,這個效率會比較差; 而mongoDB中使用的MVCC:使用的是不一樣的併發控制方法
每次有寫操做以後,把修改後的內容以wt_mvcc的數據格式添加到紅色箭頭這個頭部;而後讀操做每次都是從鏈表頭根據對應的修改事務ID和本次讀操做的snapshot結合判斷是否能夠讀,若是不可讀,則往MVCC list尾方向移動,直到找到能讀的數據版本;
每60s或log文件達到2GB時會作一次Checkpoint,將當前的數據持久化,產生一個新的快照。
通常:
1.建立事務對象;開啓對象
2.執行,執行若是遇到衝突或執行失敗,須要回滾事務
3.若是執行都正常完成,只須要提交便可;
而Wiredtiger存儲引擎在事務開啓的過程當中,在建立事務對象的同時回把這個對象加入到全局事務管理器中; 事務在執行的時候,若是是讀操做,就不作任何操做,由於讀操做不須要rollback和commit;具體過程以下圖
參考: