MongoDB 提升效能的18原則(開發設計階段)

來源:互聯網
上載者:User

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

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

 

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

    解讀:MongoDB文檔中都會有一個“_id”鍵,預設是個ObjectID對象(標識符中包含時間戳記、機器ID、進程ID和計數器)。MongoDB在指定_id與不指定_id插入時      速度相差很大,指定_id會減慢插入的速率。

 

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

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

 

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

 

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

 

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

 

解讀:例如在test集合上建立複合式索引{a:1,b:1,c:1}。執行以下7個查詢語句:

  1. db.test.find({a:”hello”})
  2. db.test.find({b:”sogo”, a:”hello”})
  3. db.test.find({a:”hello”,b:”sogo”, c:”666”})
  4. db.test.find({c:”666”, a:”hello”})
  5. db.test.find({b:”sogo”, c:”666”})
  6. db.test.find({b:”sogo” })
  7. db.test.find({c:”666”})
  • 以上查詢語句可能走索引的是1、2、3、4
  • 查詢應包含最左索引欄位,以索引建立順序為準,與查詢欄位順序無關。
  •  最少索引覆蓋最多查詢。

 

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

解讀:建立TTL的索引必須是日期類型。TTL索引是一種單欄位索引,不能是複合索引。TTL刪除文檔後台線程每60s移除失效文檔。不支援定長集合。

 

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

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

 

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

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

 

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

 

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

解讀:既可以通過設定{key:1}來顯式指定返回的欄位,也可以設定{key:0}指定需要排除的欄位。

 

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

 

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

     解讀:固定集合需要顯式建立,指定Size的大小,還能夠指定文檔的數量。集合不管先達到哪一個限制,之後插入的新文檔都會把最老的文檔移出。

 

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

 

本文著作權歸作者所有,未經作者同意不得,謝謝配合!!!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.