MongoDB入門實戰教程(14)

MongoDB入門實戰教程轉眼就到了尾聲,本篇我們就來總結一下MongoDB的應用開發最佳實踐。

1 關於MongoDB的連接

(1)MongoDB Driver:我們最好選擇與所用MongoDB服務器版本一致或相兼容的Driver版本。

(2)MongoClient:在應用程序中使用MongoClient對象連接到MongoDB實例時,應該保證它是單例,並且在整個生命週期中都從它獲取其他操作對象(如Database,Collection等)。

(3)ConnectionString:建議在連接字符串中配置大部分連接默認選項,如maxPoolSize,readConcern,writeConcern等。

// 連接到複製集
mongodb://節點1,節點2,節點3…/database?[options]
// 連接到分片集
mongodb://mongos1,mongos2,mongos3…/database?[options]

常見的連接字符串參數有:

  • maxPoolSize :連接池大小

  • maxWaitTime:最大等待時間,建議設置,自動殺掉太慢的查詢

  • writeConcern:建議設置爲majority 保證數據安全

  • readConcern:對於數據一致性要求較高的場景適當使用

對於連接字符串中的節點和地址:

  • 無論對於複製集或分片集,連接字符串中建議全部列出所有節點地址

  • 連接字符串中儘可能使用與複製集內部配置相同的域名或IP地址,建議均使用域名

不要在mongos前面使用負載均衡:MongoDB Driver自己會處理負載均衡和自動故障恢復,不要在mongos或複製集上層放置負載均衡器(比如LVS或Nginx),否則Driver會無法探測具體哪個節點存活,也無法判斷遊標是在哪個節點創建的。

2 關於查詢 和 索引

(1)每一個查詢都必須要有對應的索引,儘量使用覆蓋索引(Covered Indexes),這樣可以避免讀數據文件。

(2)儘量對每個查詢都使用projection(投影操作)來減少返回到客戶端的文檔的內容大小。

3 關於寫入

(1)在update語句裏只包括需要更新的字段

(2)儘可能使用批量插入(如InsertMany)來提升寫入性能

(3)使用TTL自動過期日誌類型的數據

4 關於文檔結構

(1)防止使用太長的字段名(這樣比較浪費空間)

(2)防止使用太深的數組嵌套(超過2層操作比較複雜)

(3)不使用中文,標點符號等非拉丁字母作爲字段名

5 關於事務

使用事務的基本原則:

(1)能避免使用就儘量避免使用

(2)模型設計先於事務,儘可能用模型設計來規避事務

(3)不要使用過大的事務(儘量控制在1000個文檔更新以內)

(4)當必須要使用事務時,儘可能讓涉及事務的文檔分佈在同一個分片上,這將有效地提高效率

6 關於分頁

使用分頁的基本原則:能不用分頁就不用分頁。

如果非要用分頁:

(1)儘量避免使用count,特別是在文檔量很大 以及 查詢條件不能完整命中索引 的時候。這時候,計算count()往往是拖慢頁面整體加載速度的最大原因。

(2)儘量避免使用skip/limit形式的分頁,特別是在文檔量很大 的時候。替代方案:使用查詢條件 + 唯一排序條件。

舉例:
第一頁: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);
……

7 總結

本文簡單介紹了一些MongoDB的應用開發最佳實踐,瞭解和應用這些最佳實踐對於我們在日常項目開發中大有裨益。

至此,MongoDB入門實戰教程系列文章也就結束了,希望能夠對你有所幫助。

最後,感謝本文的參考資料《MongoDB高手課》,我完整學習完了該課程,也把它推薦給你!

參考資料

唐建法,《MongoDB高手課》(極客時間)

郭遠威,《MongoDB實戰指南》(圖書)

△推薦訂閱學習

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章