Mongo Database效能優化

2021-12-30 02:27:05 字數 2944 閱讀 9856

mongo database效能優化

sql server有工具進行資料庫的優化,mongo database profiler.不僅有,而且功能更強大。 

mongodb 自帶 profiler,可以非常方便地記錄下所有耗時過長操作,以便於調優。有兩種方式可以控制 profiling 的開關和級別,第一種是直接在啟動引數裡直接進行設定。 

啟動mongodb時加上–profile=級別 即可。 

也可以在客戶端呼叫db.setprofilinglevel(級別) 命令來實時配置。可以通過db.getprofilinglevel()命令來獲取當前的profile級別。 

> db.setprofilinglevel(2); 

www.2cto.com    

> db.getprofilinglevel() 

上面斜體的級別可以取0,1,2 三個值,他們表示的意義如下: 

0 – 不開啟,關閉效能分析,測試環境可以開啟,生成環境關閉,對效能有很大影響 

1 – 記錄慢命令 (預設100ms) 

2 – 記錄所有命令 

profile 記錄在級別1時會記錄慢命令,那麼這個慢的定義是什麼?上面我們說到其預設為100ms,當然有預設就有設定,其設定方法和級別一樣有兩種,一種是通過新增–slowms啟動引數配置。第二種是呼叫db.setprofilinglevel時加上第二個引數: 

db.setprofilinglevel( level , slowms ) 

db.setprofilinglevel( 1 , 10 ); 

profiler 資訊儲存在 system.profile (capped collection) 中。也可以通過這個工具進行設定和檢視資料:強大的mongodb資料庫管理工具 

mongo shell 還提供了乙個比較簡潔的命令show profile,可列出最近5條執行時間超過1ms的 profile 記錄。 

檢視當前庫下所有集合的分析資料 

db.system.profile.find() 

檢視某乙個集合的分析資料 

db.system.profile.find() 

檢視執行時間大於100毫秒的執行操作,並倒序排列,並取前5行 

db.system.profile.find(}).sort().limit(5); 

profile 資訊內容詳解: 

ts-該命令在何時執行.   www.2cto.com  

millis time-該命令執行耗時,以毫秒記. 

info-本命令的詳細資訊. 

query-表明這是乙個query查詢操作. 

ntoreturn-本次查詢客戶端要求返回的記錄數.比如, findone()命令執行時 ntoreturn 為 1.有limit(n) 條件時ntoreturn為n. 

query-具體的查詢條件(如x>3). 

nscanned-本次查詢掃瞄的記錄數. 

reslen-返回結果集的大小. 

nreturned-本次查詢實際返回的結果集. 

update-表明這是乙個update更新操作. 

fastmod-indicates a fast modify operation. see updates. these operations are normally quite fast.   www.2cto.com  

fastmodinsert – indicates a fast modify operation that performed an upsert. 

upsert-表明update的upsert引數為true.此引數的功能是如果update的記錄不存在,則用update的條件insert一條記錄. 

moved-表明本次update是否移動了硬碟上的資料,如果新記錄比原記錄短,通常不會移動當前記錄,如果新記錄比原記錄長,那麼可能會移動記錄到其它位置,這時候會導致相關索引的更新.磁碟操作更多,加上索引更新,會使得這樣的操作比較慢. 

insert-這是乙個insert插入操作. 

getmore-這是乙個getmore 操作,getmore通常發生在結果集比較大的查詢時,第乙個query返回了部分結果,後續的結果是通過getmore來獲取的。 

2、優化 

www.2cto.com  

mongodb 查詢優化 

如果nscanned(掃瞄的記錄數)遠大於nreturned(返回結果的記錄數)的話,那麼我們就要考慮通過加索引來優化記錄定位了。 

reslen 如果過大,那麼說明我們返回的結果集太大了,這時請檢視find函式的第二個引數是否只寫上了你需要的屬性名。(類似於mysql中不要總是select *) 

對於建立索引的建議是:如果很少讀,那麼盡量不要新增索引,因為索引越多,寫操作會越慢。如果讀量很大,那麼建立索引還是比較划算的。 

mongodb 更新優化 

如果寫查詢量或者update量過大的話,多加索引是會有好處的。以及~~~~(省略n字,和rdbms差不多的道理) 

use fast modify operations when possible (and usually with these, an index). see updates. 

profiler 的效率 

profiling 功能肯定是會影響效率的,但是不太嚴重,原因是他使用的是system.profile 來記錄,而system.profile 是乙個capped collection 這種collection 在操作上有一些限制和特點,但是效率更高。   www.2cto.com  

優化建議: 

如果 nscanned 遠大於 nreturned,那麼需要使用索引。 

如果 reslen 返回位元組非常大,那麼考慮只獲取所需的字段。 

執行 update 操作時同樣檢查一下 nscanned,並使用索引減少文件掃瞄數量。

使用 db.eval() 在服務端執行某些統計操作。 

減少返回文件數量,使用 skip & limit 分頁。

效能測試 效能測試步驟

針對此次庫內作業效能測試,梳理一下期間的工作流程 梳理已有的介面指令碼,確認需要做效能測試的幾個介面,即使用率高,對效能有要求的幾個主要介面。結合頁面的操作,和確認的介面,梳理具體的業務邏輯 同時,請開發人員部署了測試環境。測試環境的伺服器指標,盡量和生產環境一致。部署的時候,負載均衡等情況也盡量和...

《效能之巔》初識效能

效能是一門令人激動 富於變化的學科同時又充滿挑戰的學科。衡量效能乙個重要指標 延時 系統效能是對於整個系統進行研究,包括了所有的硬體元件和整個軟體棧。通用的軟體棧有哪些呢?包括作業系統 os 核心,資料庫和應用程式層。術語中的 全棧 有時候指的是程式應用環境,包含資料庫,應用程式,和 伺服器。效能通...

PHP效能 序 談效能

這裡不談php的效能和其他語言的效能,這裡討論php自身的效能問題。效能是什麼?通俗的來講,效能,就是在固定的環境下能做的事情的多少。為什麼要效能?1 每乙個軟體或 的環境是相對固定的 2 在相當的一段時間內,在保障增加的使用者數量的同時使得當前環境的軟體或 能夠正常執行 3 為了省錢 php的效能...