Mongodb 實戰優化

2021-07-11 07:30:24 字數 3582 閱讀 2369

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...