《MongoDB高手課》學習記錄(第二十一天)

從新啓航

沒想到學習的進程一下中斷了半年時間。最開始是由於項目的緣由、以後是新年、而後是新冠……,固然,最重要的緣由是懶,哈哈。mongodb

第二十一天

今天要學習的是《24 | MongoDB開發最佳實踐》節。這節是第二章的最後一篇文章,課程的連接點這裏,是第二章課程的一個總結。安全

鏈接到MongoDB

首先強調的一點就是,必定要選擇與你所使用的版本相兼容的驅動程序,特別是使用程序框架的時候,不然會遇到一些沒法解釋的奇葩問題。驅動的兼容列表點這裏負載均衡

鏈接字符串

鏈接地址建議使用域名而不是IP,方便物理機出現故障時更換。框架

鏈接到複製集(建議寫上全部的複製節點)運維

mongodb://節點1,節點2,節點3.../database?[options]

鏈接到分片集(寫上mongos地址就好了)post

mongodb://mongos1,mongos2,mongos3.../database?[options]

經常使用鏈接字符串參數

參數 說明
maxPoolSize 鏈接池大小不必定非要設置,有默認值的
MaxWaitTime 建議設置,慢查詢超時時,後自動殺掉
WriteConcern 建議設置,用於保證數據的安全性
ReadConcern 不必定非要設置,有默認值,用於保證數據的一致性

mongodb+srv:// 協議

不用在鏈接串中寫全部節點地址,而是經過虛擬域名來進行解析,3.6版本後支持。性能

mongos自帶負載均衡

鏈接字符串寫全就好了,系統會自動處理鏈接到哪一個mongos學習

遊標的使用

通常遊標查詢結束後,會自動關閉。若是查詢太大,沒自動關,能夠調用close()方法手工關了,若是不關,10分鐘後系統自動殺掉。設計

關於查詢及索引

  1. 理論上是要每一個查詢都須要有對應的索引,由於mongodb沒有資源隔離,慢查詢會影響系統的全部操做。
  2. 儘可能使用 Covered Indexes 索引(從索引裏看出來要取的字段了,避免去讀數據文件)。
  3. 須要啥字段就讀啥字段,別一下都讀出來,而後到客戶端再過濾,提升性能

關於寫入

  1. 更新啥就寫啥更新字段
  2. 使用批量寫入來提升性能
  3. 使用TTL索引,來處理自動過時的日誌類型的數據,到期會自動刪除

關於文檔結構

  1. 別使用太長的字段名,浪費存儲空間
  2. 數據嵌套別太多,雖然mongodb支持多層嵌套,別超過2層。
  3. 使用英文字母來當字段名,別使用中文、標點符號等

處理分頁

避免使用count,由於使用 count 的時候,有多少條記錄都會逐條遍歷一次。固然也避免使用skip/limit形式的分頁,特別是數據量大的時候;日誌

db.coll.find({x: 100}).limit(50); 
db.coll.count({x: 100});

那分頁怎麼辦?
沒啥好辦法!

替代方案:使用查詢條件+惟一排序條件;
例如:
第一頁:db.posts.find({}).sort({_id: 1}).limit(20);
第二頁:db.posts.find({_id: {$gt: <第一頁最後一個_id>}}).sort({_id: 1}).limit(20); 
第三頁:db.posts.find({_id: {$gt: <第二頁最後一個_id>}}).sort({_id: 1}).limit(20);

關於事務

  1. 不建議使用事務,效率過低
  2. 建議經過模型設計來避免事務的使用,一個文檔解決就好
  3. 若是非要用,別使用大事務(這裏指超過1000個文檔的事務),小批量來處理,由於60秒默認超時限制
  4. 必須使用事務時,也要讓文檔都分佈在一個分片上(雖然支持存在多個分片上),提升性能

最後

好啦,今天的學習到此結束,明天開始學習第三章運維的部分,同時複習一下第二章的內容。

相關文章
相關標籤/搜索