提公升MongoDB效能的方法

2022-09-25 10:42:13 字數 2644 閱讀 1045

mongodb 是高效能資料,但是在使用的過程中,大家偶爾還會碰到一些效能問題。mongodb和其它關係型資料庫相比,例如 sql server 、mysql 、oracle 相比來說,相對較新,很多人對其不是很熟悉,所以很多開發、dba往往是注重功能的實現,而忽視了效能的要求。其實,mongodb和 sql server 、mysql 、oracle 一樣,乙個 資料庫物件的設計調整、索引的建立、語句的優化,都會對效能產生巨大的影響。

為了充分挖掘mongodb效能,現簡單總計了以下18條,歡迎大家一起來持續總結完善。

(1)文件中的_id鍵推薦使用預設值,禁止向_id中儲存自定義的值。

解讀: mongodb文件中都會有乙個「_id」鍵,預設是個objectid物件(識別符號中包含時間戳、機器id、程序id和計數器)。mongodb在指定_i程式設計客棧d與不指定_id插入時 速度相差很大,指定_id會減慢插入的速率。

(2)推薦使用短欄位名。

解讀:與關係型資料庫不同,mongodb集合中的每乙個文件都需要儲存欄位名,長欄位名會需要更多的儲存空間。

(3)mongodb索引可以提高文件的查詢、更新、刪除、排序操作,所以結合業務需求,適當建立索引。

(4)每個索引都會占用一些空間,並且導致插入操作的資源消耗,因此,建議每個集合的索引數盡量控制在5個以內。

(5)對於包含多個鍵的查詢,建立包含這些鍵的復合索引是個不錯的解決方案。復合索引的鍵值順序很重要,理解索引最左字首原則。

解讀:例如在test集合上建立組合索引。執行以下7個查詢語句:

db.test.find() // 1

db.test.find() // 2

db.test.find() // 3

db.test.find() // 4

db.test.find() // 5

db.test.find() // 6

db.test.find() // 7

以上查詢語句可能走索引的是1、2、3、4

查詢應包含最左索引字段,以索引建立順序為準,與查詢字段順序無關。

最少索引覆蓋最多查詢。

(6)ttl 索引(time-to-live index,具有生命週期的索引),使用ttl索引可以將超時時間的文件老化,乙個文件到達老化的程度之後就會被刪除。

解讀:建立ttl的索引必須是日期型別。ttl索引是一種單字段索引,不能是復合索引。ttl刪除文件後台執行緒每60s移除失效文件。不支援定長集合。

(7)需要在集合中某欄位建立索引,但集合中大量的文件不包含此鍵值時,建議建立稀疏索引。

解讀:索引預設是密集型的,這意味著,即使文件的索引字段缺失,在索引中也存在著乙個對應關係。在稀疏索引中,只有包含了索引鍵值的文件才會出現。

(8)建立文字索引時欄位指定text,而不是1或者-1。每個集合只有乙個文字索引,但是它可以為任意多個字段建立索引。

解讀:文字搜尋速度快很多,推薦使用文字索引替代對集合文件的多字段的低效查詢。

(9)使用findone在資料庫中查詢匹配多個專案,它就會在自然排序檔案集合中返回第乙個專案。如果需要返回多個文件,則使用find方法。

(10)如果查詢無需返回整個文件或只是用來判斷鍵值是否存在,可以通過投影(對映)來限制返回字段,減少網路流量和客戶端的記憶體使用。

解讀:既可以通過設定來顯式指定返回的字段,也可以設定指定需要排除的字段。

(11)除了字首樣式查詢,正規表示式查詢不能使用索引,執行的時間比大多數選擇器更長,應節制性地使用它們。

(12)在聚合運算中,$要在match要在$group前面,通過$前置,可以減少match前置,可以減少$ group 操作符要處理的文件數量。

(13)通過操作符對文件進行修改,通常可以獲得更好的效能,因為,不需要往返伺服器來獲取並修改文件資料,可以在序列化和傳輸資料上花費更少的時間。

(14)批量插入(batchinsert)可以減少資料向伺服器的提交次數,提高效能。但是批量提交的bson size不超過48mb。

(15)禁止一次取出太多的資料進行排序,mongodb目前支援對32m以內的結果集進行排序。如果需要排序,請盡量限制結果集中的資料量。

(16)查詢中的某些$操作符可能會導致效能低下,如操作符可能會導致效能低下,如$ne,$,not,$exists,$nin,$or盡量在業務中不要使用。

a) $exist:因為鬆散的文件結構導致查詢必須遍歷每乙個文件;

b) $ne:如果當取反的值為大多數,則會掃瞄整個索引;

c) $not:可能會導致查詢優化器不知道應當使用哪個索引,所以會經常退化為全表掃瞄;

d) $nin:全表掃瞄;

e) \$有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換為or:有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換為$in。

(17)固定集合可以用於記錄日誌,其插入資料更快,可以實現在插入資料時,淘汰最早的資料。需求分析和設計時,可考慮此特性,即提高了效能,有省去了刪除動作。

解讀qmstqqwwx:固定集合需要顯式建立,指定size的大小,還能夠指定文件的數量。集合不管先達到程式設計客棧哪乙個限制,之後插入的新文件都會把最老的文件移出。

(18)集合程式設計客棧中文件的資料量會影響查詢效能,為保持適量,需要定期歸檔。

mongodb效能優化

資料庫效能對軟體整體效能有著至關重要的影響,對於mongodb資料庫常用的效能優化方法主要有:

1、正規化化與反正規化化;

2、填充因子的使用;

3、索引的使用;

提公升Java效能的基本方法

一 不要再迴圈條件中計算 應該是 int total count 2 while i 在類載入後就會生成該陣列,麼次方法呼叫的時候就不用重新生成了 三 縮小變數的作用範圍 方法能定義在方法內就放在方法內,能放在迴圈體內就放在迴圈體內,能放在乙個try catch塊中就放在塊中,因為這可以加快gc的 ...

提公升SRAM效能的傳統方法

隨著諸如醫療電子和無線感測節點等應用的興起,低功耗晶元受到了越來越廣泛的關注.這類晶元對效能和功耗要求苛刻.靜態隨機儲存器 sram 作為晶元的重要組成部分,大程度上影響著晶元的面積和功耗,因此其功耗的優化成了晶元功耗優化的關鍵所在。sram單元的資料保持功能是通過背靠背的反相器實現的,因此為了使單...

linux效能提公升方法(整理)

1.通過 ulimit 改善系統效能 如何通過最簡單的設定來實現最有效的效能調優,如何在有限資源的條件下保證程式的運作,ulimit 是我們在處理這些問題時,經常使用的一種簡單手段。ulimit 是一種 linux 系統的內鍵功能,它具有一套引數集,用於為由它生成的 shell 程序及其子程序的資源...