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實戰指南》(圖書)
△推薦訂閱學習