MongoDB - 讀寫性能


數據庫請求流程

應用端

應用端視角里(MongoDB驅動程序與MongoDB進行交互),一次數據庫請求流程如下:
應用端

  • 選擇節點
    在復制集讀操作里,選擇節點會受readPreference參數影響
  • 排隊等待
    總連接數大於最大連接數maxPoolSize,連接滿了如何解決:優化查詢性能,提高服務端資源等
  • 連接與認證
    等待創建連接和認證將比直接從連接池獲取連接更耗時,所以應該設置minPoolSize一次性創建足夠的連接,避免突發的大量請求

數據庫端

數據庫端

wiredTiger的ticket:大概有點像semaphore?

  • 排隊等待
    ticket是和系統的資源相關的,增大ticket並不會優化排隊等待,所以我們其實是需要優化CURD
  • 合並結果
    在mongos進行結果合並,盡量使用帶片鍵的查詢條件減少參與查詢的分片數

執行請求

執行請求(讀)的具體過程如下圖,造成性能問題的主要原因就是不能命中索引和內存排序

執行請求讀

執行請求(寫),MongoDB默認是{j:false},即不用先刷盤,直接寫內存緩存就能返回了,操作如下圖:
執行請求寫

  • 磁盤速度必須比寫入速度快才能保證(寫頻繁情況下的)性能

性能瓶頸總結

  • 應用端:選擇入口節;等待數據庫連接;創建連接和完成認證
  • 服務端:排隊等ticket;執行請求;合並執行結果
  • 網絡:應用/驅動->mongos;mongos->片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM