1.邏輯結構
MongoDB 與 MySQL 中的架構相差不多,底層都使用了可插拔的存儲引擎以滿足用戶的不同需要。用戶可以根據程序的數據特征選擇不同的存儲引擎,在最新版本的 MongoDB 中使用了 WiredTiger 作為默認的存儲引擎,WiredTiger 提供了不同粒度的并發控制和壓縮機制,能夠為不同種類的應用提供了最好的性能和存儲率。
在存儲引擎上層的就是 MongoDB 的數據模型和查詢語言了,由于 MongoDB 對數據的存儲與 RDBMS有較大的差異,所以它創建了一套不同的數據模型和查詢語言。
2.數據模型
2.1內嵌
內嵌的方式指的是把相關聯的數據保存在同一個文檔結構之中。MongoDB的文檔結構允許一個字段或者一個數組內的值作為一個嵌套的文檔。
主要適用于:
- 數據對象之間有包含關系 ,一般是數據對象之間有一對多或者一對一的關系 。
- 需要經常一起讀取的數據。
- 有 map-reduce/aggregation 需求的數據放在一起,這些操作都只能操作單個 collection。
2.2引用
引用方式通過存儲數據引用信息來實現兩個不同文檔之間的關聯,應用程序可以通過解析這些數據引用來訪問相關數據。
主要適用于:
- 當內嵌數據會導致很多數據的重復,并且讀性能的優勢又不足于覆蓋數據重復的弊端 。
- 需要表達比較復雜的多對多關系的時候 。
- 大型層次結果數據集嵌套不要太深。
3.存儲引擎
3.1 概述
存儲引擎是MongoDB的核心組件,負責管理數據如何存儲在硬盤和內存上。MongoDB支持的存儲引擎有MMAPv1 ,WiredTiger和InMemory。
InMemory存儲引擎用于將數據只存儲在內存中,只將少量的元數據(meta-data)和診斷日志(Diagnostic)存儲到硬盤文件中,由于不需要Disk的IO操作,就能獲取所需的數據,InMemory存儲引擎大幅度降低了數據查詢的延遲(Latency)。
從MongoDB3.2開始默認的存儲引擎是WiredTiger,3.2版本之前的默認存儲引擎是MMAPv1. MongoDB4.x版本不再支持MMAPv1存儲引擎。
3.2 WiredTiger存儲引擎優勢
- 文檔空間分配方式
WiredTiger使用的是BTree存儲;
MMAPv1使用的是線性存儲; - 并發級別
WiredTiger使用文檔級別鎖;
MMAPv1使用表級鎖; - 數據壓縮
WiredTiger采用snappy (默認) 和 zlib 壓縮表數據;
WiredTiger相比MMAPV1(無壓縮) 空間節省數倍; - 內存使用
WiredTiger 可以指定內存的使用大小; - Cache使用
WiredTiger引擎使用了二階緩存WiredTiger Cache, File System Cache來保證Disk上的數據的最終一致性;
MMAPv1 只有journal 日志;