十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
如何提升MongoDB的性能?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、邵武網(wǎng)站維護、網(wǎng)站推廣。
(1)文檔中的_id鍵推薦使用默認(rèn)值,禁止向_id中保存自定義的值。
解讀: MongoDB文檔中都會有一個“_id”鍵,默認(rèn)是個ObjectID對象(標(biāo)識符中包含時間戳、機器ID、進程ID和計數(shù)器)。MongoDB在指定_id與不指定_id插入時 速度相差很大,指定_id會減慢插入的速率。
(2)推薦使用短字段名。
解讀:與關(guān)系型數(shù)據(jù)庫不同,MongoDB集合中的每一個文檔都需要存儲字段名,長字段名會需要更多的存儲空間。
(3)MongoDB索引可以提高文檔的查詢、更新、刪除、排序操作,所以結(jié)合業(yè)務(wù)需求,適當(dāng)創(chuàng)建索引。
(4)每個索引都會占用一些空間,并且導(dǎo)致插入操作的資源消耗,因此,建議每個集合的索引數(shù)盡量控制在5個以內(nèi)。
(5)對于包含多個鍵的查詢,創(chuàng)建包含這些鍵的復(fù)合索引是個不錯的解決方案。復(fù)合索引的鍵值順序很重要,理解索引最左前綴原則。
解讀:例如在test集合上創(chuàng)建組合索引{a:1,b:1,c:1}。執(zhí)行以下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
查詢應(yīng)包含最左索引字段,以索引創(chuàng)建順序為準(zhǔn),與查詢字段順序無關(guān)。
最少索引覆蓋最多查詢。
(6)TTL 索引(time-to-live index,具有生命周期的索引),使用TTL索引可以將超時時間的文檔老化,一個文檔到達老化的程度之后就會被刪除。
解讀:創(chuàng)建TTL的索引必須是日期類型。TTL索引是一種單字段索引,不能是復(fù)合索引。TTL刪除文檔后臺線程每60s移除失效文檔。不支持定長集合。
(7)需要在集合中某字段創(chuàng)建索引,但集合中大量的文檔不包含此鍵值時,建議創(chuàng)建稀疏索引。
解讀:索引默認(rèn)是密集型的,這意味著,即使文檔的索引字段缺失,在索引中也存在著一個對應(yīng)關(guān)系。在稀疏索引中,只有包含了索引鍵值的文檔才會出現(xiàn)。
(8)創(chuàng)建文本索引時字段指定text,而不是1或者-1。每個集合只有一個文本索引,但是它可以為任意多個字段建立索引。
解讀:文本搜索速度快很多,推薦使用文本索引替代對集合文檔的多字段的低效查詢。
(9)使用findOne在數(shù)據(jù)庫中查詢匹配多個項目,它就會在自然排序文件集合中返回第一個項目。如果需要返回多個文檔,則使用find方法。
(10)如果查詢無需返回整個文檔或只是用來判斷鍵值是否存在,可以通過投影(映射)來限制返回字段,減少網(wǎng)絡(luò)流量和客戶端的內(nèi)存使用。
解讀:既可以通過設(shè)置{key:1}來顯式指定返回的字段,也可以設(shè)置{key:0}指定需要排除的字段。
(11)除了前綴樣式查詢,正則表達式查詢不能使用索引,執(zhí)行的時間比大多數(shù)選擇器更長,應(yīng)節(jié)制性地使用它們。
(12)在聚合運算中,$要在match要在$group前面,通過$前置,可以減少match前置,可以減少$ group 操作符要處理的文檔數(shù)量。
(13)通過操作符對文檔進行修改,通??梢垣@得更好的性能,因為,不需要往返服務(wù)器來獲取并修改文檔數(shù)據(jù),可以在序列化和傳輸數(shù)據(jù)上花費更少的時間。
(14)批量插入(batchInsert)可以減少數(shù)據(jù)向服務(wù)器的提交次數(shù),提高性能。但是批量提交的BSON Size不超過48MB。
(15)禁止一次取出太多的數(shù)據(jù)進行排序,MongoDB目前支持對32M以內(nèi)的結(jié)果集進行排序。如果需要排序,請盡量限制結(jié)果集中的數(shù)據(jù)量。
(16)查詢中的某些$操作符可能會導(dǎo)致性能低下,如操作符可能會導(dǎo)致性能低下,如$ne,$,not,$exists,$nin,$or盡量在業(yè)務(wù)中不要使用。
a) $exist:因為松散的文檔結(jié)構(gòu)導(dǎo)致查詢必須遍歷每一個文檔;
b) $ne:如果當(dāng)取反的值為大多數(shù),則會掃描整個索引;
c) $not:可能會導(dǎo)致查詢優(yōu)化器不知道應(yīng)當(dāng)使用哪個索引,所以會經(jīng)常退化為全表掃描;
d) $nin:全表掃描;
e) \$有多個條件就會查詢多少次,最后合并結(jié)果集,應(yīng)該考慮裝換為or:有多個條件就會查詢多少次,最后合并結(jié)果集,應(yīng)該考慮裝換為$in。
(17)固定集合可以用于記錄日志,其插入數(shù)據(jù)更快,可以實現(xiàn)在插入數(shù)據(jù)時,淘汰最早的數(shù)據(jù)。需求分析和設(shè)計時,可考慮此特性,即提高了性能,有省去了刪除動作。
解讀:固定集合需要顯式創(chuàng)建,指定Size的大小,還能夠指定文檔的數(shù)量。集合不管先達到哪一個限制,之后插入的新文檔都會把最老的文檔移出。
(18)集合中文檔的數(shù)據(jù)量會影響查詢性能,為保持適量,需要定期歸檔。
Mongodb性能優(yōu)化
數(shù)據(jù)庫性能對軟件整體性能有著至關(guān)重要的影響,對于Mongodb數(shù)據(jù)庫常用的性能優(yōu)化方法主要有:
1、范式化與反范式化;
2、填充因子的使用;
3、索引的使用;
看完上述內(nèi)容,你們掌握如何提升MongoDB的性能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!