首頁  >  文章  >  資料庫  >  MongoDB提升效能的方法總結

MongoDB提升效能的方法總結

不言
不言原創
2018-09-19 15:21:272050瀏覽

這篇文章帶給大家的內容是關於MongoDB提升效能的方法總結,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

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個查詢語句:

db.test.find({a:”hello”}) // 1
db.test.find({b:”sogo”, a:”hello”}) // 2
db.test.find({a:”hello”,b:”sogo”, c:”666”}) // 3
db.test.find({c:”666”, a:”hello”}) // 4
db.test.find({b:”sogo”, c:”666”}) // 5
db.test.find({b:”sogo” }) // 6
db.test.find({c:”666”}) // 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)如果查詢無需返回整個文件或只是用來判斷鍵值是否存在,可以透過投影(映射)來限制返回字段,減少網路流量和客戶端的記憶體使用。

解讀:既可以透過設定{key:1}來明確指定傳回的字段,也可以設定{key:0}指定需要排除的字段。

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

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

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

以上是MongoDB提升效能的方法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn