mongodb是乙個高效能,可擴充套件資料庫,並具有低延遲,高吞吐率的效能。但是使用過程中難免會有所坑,下面將介紹一些優化方案。
以下建議翻譯自 亞馬遜的 《performance best practices for mongodb 2015》
補充是自己在mongodb實踐中的總結
1、mongodb引擎
mongodb 3.0 支援了2種引擎:
a、預設的 mmapv1 引擎,老版本一種使用
b、wiredtiger 引擎,新支援的db引擎
這兩種引擎可以在乙個副本集中共存,他們之前的遷移是很容易,也就是說,從 mmapv1 老的引擎公升級到新的
wiredtiger
引擎是不會破壞原有資料的。
這兩種引擎是為不同的業務場景做的優化,下面的優化方案會提及支援的相關引擎。
2、硬體優化
2.1、確保足夠的記憶體:
保證記憶體大於資料儲存大小,優化記憶體是最顯而易見的方案
補充:實踐證明,盡量保證資料塊大小不要超出系統記憶體的一半,效能最優
2.2、在高寫入應用中,使用ssd硬碟
mongodb的落盤操作是隨機的,一般60s落盤,100ms寫journal,所以使用ssd硬碟一般會有很顯著的寫入20-50倍的提公升。
補充:當內存在合理範圍內,更換ssd硬碟並不會顯著提公升寫效能,關閉
journal會提公升一些效能,但是可能會帶來資料丟失的風險
2.3、壓縮儲存和i/o密集型負載
新的儲存引擎
wiredtiger
允許壓縮儲存,設定合理的壓縮配置,可以防止壓縮過大導致的i/o密集型的cpu負載過高的情況。
2.4、使用更快的cpu
這點毋容置疑,新的儲存引擎
wiredtiger可以比
mmapv1更好的利用多核。
2.5、盡量將mongodb例項獨享物理裝置
這兒也不用多說,獨享裝置肯定是最好
2.6、使用多個mongos
當集群增加後,也要相應的增加mongos
3、應用層優化
3.1、只更新需要更新的字段:
不是更新所有的字段,而只是更新需要更新的改變過的字段,這樣可以避免檢索文件所有的字段,減少網路傳輸和資料庫負載。
3.2、避免單一 非 條件的查詢:
如果單一的非條件查詢,會進行全表掃瞄,盡量避免它
3.3、在你的應用中,使用 explain() 測試你的每一條語句
執行計畫explain()可以讓你有很多意想不到的收穫
3.4、覆蓋索引的查詢
這個無需多說了,查詢的條件盡可能多的覆蓋索引
3.5、避免不帶片鍵查詢
在集群中,如果不帶片鍵查詢,會去每片查詢,避免這樣的操作
3.6、讀寫分離
因為主庫和從庫的同步延遲,如果應用能容忍延遲,最好是從庫讀,主庫寫
3.7、使用最新的客戶端連線庫
mongodb一直在不斷的更新,盡量使用官方提供的最新連線庫
3.8、分片均勻
如果 mongodb 採用分片,片鍵的選擇非常重要,又要能分片均勻,又要保證讀寫效能高,還要保證可擴充套件
3.9、選擇合適的片鍵
同上
補充:
4.0、大量更新批量操作
實際經驗,如果乙個集合有大量的upate或insert操作,那麼與其乙個個操作的去連線,不如匯聚到1000-5000條左右,一次性批量寫入,可以有效減少鎖的競爭情況,效能有顯著提高。
4、結構設計和索引
4.1、盡量把資料存成乙個文件
在合適的時候把資料儲存為乙個文件,可以非常高效的利於查詢,這樣搜尋的條數就很少,開啟展平對於搜尋是不利的,但是過重的乙個文件可能也會帶來寫的問題。
4.2、避免過大文件
mongodb乙個文件最大為16mb,在實際情況中,很多文件都是小於幾kb的,比如在文件裡維護乙個很大的列表,應該將列表開啟,一行一條記錄。
4.3、避免文件無限的增長
mongodb為了節約儲存空間,會以 usepowerof2sizes 來增長乙個文件的儲存空間,舉個例子:
比如:第一次插入這個文件,文件大小為1kb,這時mongodb會以2kb來儲存,在文件增長到2kb以內時,是不會移動文件和索引儲存塊的。當這個文件增長到 2kb 後,mongodb又會設定 4kb 來儲存它,每次都是以2倍的量儲存,保證了空間的利用和儲存塊移動之間的平衡。
如果乙個文件不停的無限增長,可能會因為頻繁的移動儲存塊而影響效能。
補充:實際情況中設定
usepowerof2sizes這個引數,並沒有顯著的效能提公升
4.4、避免大的索引陣列
多欄位索引可能會利於查詢,但是會讓寫操作變慢,所以要權衡一下。
4.5、避免過長的欄位名
mongodb的欄位名和sql不同,會占用文件的空間,增加網路傳輸壓力,盡量用短小精簡的欄位名,可以在程式那邊做對映。
補充:實際情況,設定短小精簡的欄位名,可以顯著提公升查詢效能
4.6、避免 select * 的查詢
這點和sql一樣,用不到的字段不要返回了
補充:實際情況也是如此,不查詢不需要的字段,顯著提公升效能
4.7、優化索引
避免索引命中不雜湊,比如對乙個列舉,布林值做索引,都是無效的
4.8、組合索引可以包含單個索引
比如有乙個組合索引 ,是沒必要建立 這個索引的,因為已經被包括在了組合索引裡了
4.9、避免正規表示式沒有命中索引
這個類似sql的like,如果要命中索引,必須從頭開始匹配
4.10、使用 wiredtiger 引擎,索引放其他地方儲存
使用 wiredtiger
引擎,索引可以放在其他地方儲存,比如更快的硬碟,資源爭搶i/o更少的磁碟
5、磁碟i/o
5.1、readhead需要設定為32
為了mongodb的效能,readhead這個值不能設定少於32,如果設定過多會浪費記憶體。
5.2、使用ext4或者xfs檔案系統,避免ext3
ext3檔案系統太過陳舊,沒有對資料庫進行優化,不夠高效
5.3、關閉 access time 設定
關閉對檔案最後一次訪問的時間記錄,因為database一直在訪問檔案,所以關閉它能夠提公升效能
5.4、不要使用大量的虛擬記憶體
將虛擬記憶體設定為合理大小,不要設定過大
5.5、使用raid10
使用raid10來做儲存,效能和資料安全都***
6、效能配置
6.1、做好效能測試
在應用上線之前,需要做效能測試來評估
6.2、片鍵
如果沒有範圍的片鍵搜尋,建議使用hash來使用片鍵,如果有範圍的搜尋,建議將他們提前處理,然後並行搜尋獲取。
6.3、關閉塊自動平衡
關閉自動移動塊平衡,提公升效能
補充:實際情況中,這個設定沒有顯著提公升效能,建議還是開啟
6.4、預熱系統幾分鐘
這個看上去沒啥用
6.5、對系統瓶頸進行監控
這個也是必須的
MongoDB實戰指南 二 索引與查詢優化
資料庫儲存記錄的機制是建立在檔案系統上的,索引也是以檔案的形式儲存在磁碟上,在資料庫中用到最多的索引結構就是b樹。儘管索引在資料庫領域是不可缺少的,但是對乙個表建立過多的索引會帶來一些問題,索引的建立要花費系統時間,同時索引檔案也會占用磁碟空間。如果併發寫入的量很大,每個插入的文件都要建立索引,可想...
mongodb分片實戰
分片技術其實就是乙個分布式的過程,但是mongodb的負載和其他的負載有所不同,在整個mongodb分布式的集群中一共有如下角色 mongos mongos就是乙個路由伺服器,它會根據管理員設定的 片鍵 將資料分攤到自己管理的mongod集群,負責和客戶端直接互動 config 資料和片的對應關係以...
ubuntu安裝mongodb實戰
1的linux 版本的壓縮包,並解壓到本地目錄 usr local coolcao mongodb 2 建立資料檔案存放目錄,這裡我存放的目錄在 usr local coolcao mongodb data 3 建立日誌目錄及日誌檔案 usr local coolcao mongodb log mo...