MongoDB 基礎
- 以 BSON (Binary JSON) 儲存資料
- BSON 是 JSON 的二進位版本,支援更多資料型別,如日期和二進位資料
- _id 欄位作為預設的主鍵
- 若未指定,MongoDB 會自動生成一個 12 字節的 ObjectId
- 用於確保文件中唯一性,特別在分散式系統中
索引機制
Composite Index
- 由多個欄位組成,例如 (a, b)
- Prefix 特性
- 如果索引為 (a, b),則 (a) 也可被單獨使用
- 但 (b) 或 (a, b, c) 無法直接利用此索引
- Hint
- 可強制 MongoDB 使用特定索引
- 用於測試或避免 optimizer 選錯索引
Explain 分析查詢
- 用來檢視查詢的執行計畫
- 重要欄位
- cursor
- BasicCursor 表示全表掃描,應避免
- BtreeCursor 表示使用索引
- nscanned
- nscannedObjects
- n
- 關係:nscanned >= nscannedObjects >= n
- scanAndOrder
- 表示需要將文件載入記憶體並排序
- 通常一次性返回所有結果,效率較低
Optimizer 索引選擇
- 第一階段:尋找最佳索引
- 最佳索引條件
- 包含所有 filter 和 sort 的欄位
- equality filter 必須在 range filter 之前
- sort 欄位必須在 range filter 之後
- 若有多個最佳索引條件符合條件,隨便選擇一個
- 第二階段:實驗性選擇
- 若無最佳索引,會測試多個索引
- optimizer 選擇 nscanned 最小的索引作為最終方案
儲存引擎
MMAPv1
- MongoDB 早期的儲存引擎
- 特性
- _id 直接對應 disk 偏移量 (diskloc)
- 鎖定機制
- 初始為 database-level lock
- 後期升級至 collection-level lock
- 已於 MongoDB 4.0 後棄用
WiredTiger
- MongoDB 收購並採用的新儲存引擎
- 特性
- Document-level locking,提升並發效能
- 支援資料壓縮,減少儲存空間
- 版本演進
- 5.2 之前
- _id 用於查找 recordid
- recordid 作為 clustered index,指向實際文件
- 5.3 之後
- _id 直接成為 clustered index
- _id 為 12 字節 (ObjectId),比原 64 位 recordid 更大
- 影響
- 對 secondary index 增加儲存負擔
- 提升跨機器和 shard 環境中的唯一性