MongoDB - 讀寫效能
阿新 • • 發佈:2022-03-22
資料庫請求流程
應用端
應用端視角里(MongoDB驅動程式與MongoDB進行互動),一次資料庫請求流程如下:
- 選擇節點
在複製集讀操作裡,選擇節點會受readPreference
引數影響 - 排隊等待
總連線數大於最大連線數maxPoolSize
,連線滿了如何解決:優化查詢效能,提高服務端資源等 - 連線與認證
等待建立連線和認證將比直接從連線池獲取連線更耗時,所以應該設定minPoolSize
一次性建立足夠的連線,避免突發的大量請求
資料庫端
wiredTiger的ticket:大概有點像semaphore?
- 排隊等待
ticket是和系統的資源相關的,增大ticket並不會優化排隊等待,所以我們其實是需要優化CURD - 合併結果
在mongos進行結果合併,儘量使用帶片鍵的查詢條件減少參與查詢的分片數
執行請求
讀
執行請求(讀)的具體過程如下圖,造成效能問題的主要原因就是不能命中索引和記憶體排序。
寫
執行請求(寫),MongoDB預設是{j:false}
,即不用先刷盤,直接寫記憶體快取就能返回了,操作如下圖:
- 磁碟速度必須比寫入速度快才能保證(寫頻繁情況下的)效能
效能瓶頸總結
- 應用端:選擇入口節;等待資料庫連線;建立連線和完成認證
- 服務端:排隊等ticket;執行請求;合併執行結果
- 網路:應用/驅動->mongos;mongos->片