mongodb性能優化


 建立索引是優化數據庫最直接的手段.遵循以下索引優化原則,可以建立比較高效和合理的索引.

在索引中包含條件的所有列,可以使用索引形成的屏蔽來拒絕結果集中不合適的行

對於需要排序的引用列,適當地創建索引可以避免排序

考慮到管理上的開銷,應避免在索引中使用多於5個的列

對於多列索引,將查詢中引用最多的列放在定義的前面

不要在索引中包含經常修改或進行插入、刪除的列(主關鍵字和外來關鍵字除外)

“$”符號不可以作為索引的首字母,”.”不能在索引名的任何位置出現.

 

索引管理

1.建立索引的函數:ensureIndex();

eg.在name上建立索引1(升序),-1(降序),默認為升序. db.person.ensureIndex( { name : 1 } ); 當系統已有大量數據時,創建索引非常耗時,需要在后頭執行,只需要指定background:true即可. db.user.ensureIndex( { age : 1 } , { background : true } ); 建立索引后,同一條查詢語句比較2次掃描的記錄條數. > db.user.find( { name:"user5" } ).explain();

 

2.獲取集合中的索引信息

db.person.getIndexKeys();

db.person.getIndexes();

 

3.創建唯一索引

只需要在ensureIndex命令中指定"unique:true"即可創建唯一索引

db.user.ensureIndex( {age:1} , {unique:true} );

創建了唯一索引的字段不允許插入相同的值.

 

4.創建組合索引

db.user.ensureIndex({“addr.city”:1 , “addr.state”:1});  //在user集合的addr.city和addr.state列上創建組合索引.

 

5.刪除索引

db.user.dropIndexes(); //刪除usre表中的除過id外的所有索引
 db.user.dropIndex( {age:1} ); //刪除user表中的age索引

 

性能優化

explain 查看執行計划

MongoDB提供了一個explain命令讓我們獲知系統如何處理查詢請求,利用explain命令我們可以很好地觀察系統

如何使用索引來加快檢索,同時可以針對性優化索引.

 

優化器profile

MongoDB Database Profiler是一種慢查詢日志功能,可以作為我們優化數據庫的依據.

開啟Profiling功能,有2種方式可以控制Profiling的開關盒級別。

啟動MonggoDB時加上-profile=級別即可

在客戶端調用db.setProfilingLevel(級別)命令來實時配置。

Profiler信息保存在system.profile中.我們可以通過db.getProfilingLevel()命令來獲取當前的Profile級別.

profile的級別有3個,分別是0、1、2.默認沒有開啟

0 - 表示不開啟 1 - 表示記錄慢命令(默認為>100ms) 2 - 表示記錄所有命令

profile在級別1時會記錄慢命令,默認值為100ms,設置慢記錄的方法有2個

1.通過slowms啟動參數配置 2.db.setProfilingLevel(1,設置ms參數)時加上第二個參數.

 

性能監控

通過對數據庫的性能監控,能夠更好的了解數據庫的工作狀態,從而進行優化.

幾個性能監控的工具:

1.mongosniff

此功能可以從底層監控到底有哪些命令發送給mongoDB去執行,

 ./mongosniff --source net lo

它是實時動態監視的,需要打開另一個客戶端進行命令操作.可以講這些數據輸出到一個日志文件中,

那么就可以保留下所有數據庫操作的歷史記錄,對於后期的性能分析和安全審計等工作將是一個巨大的貢獻.

“lo”即Loopback,指IP數據包會送到本機上,通常使用的是127.0.0.1作為回送地址,Loopback通常用於檢測網絡配置和本地程序之間通信.

 

2.mongostat

此工具可以快速的查看某組運行中的MongoDB實例的統計信息,也需要在打開另一個客戶端進行命令操作

./mongostat

 

3.db.serverStatus命令

該命令可以查看服務器運行狀態,是最基礎的查看實例運行狀態的命令

 

4.db.stats命令

MongoDB不但可以查看實例級運行狀態信息,而且可以通過運行”db.stats”命令查看特定數據庫的詳細運行狀態,更細粒度地分析故障.

 

優化方案

優化方案1:創建索引

在查詢條件的字段上,或者排序條件的字段上創建索引,可以顯著提高執行效率.

db.user.ensureIndex( { name:1 } );

 

優化方案2 : 限定返回結果條數

使用limit()限定返回結果集的大小,可以減少database server的資源消耗,可以減少網絡傳輸數據量.

db.user.find().sort( {age:-1} ).limit(5);

 

優化方案3:查詢使用到的字段,不查詢所有字段

db.user.find( {} , {name:1} ).sort( { age:-1} ).limit(5) ;

 

優化方案4:采用capped collection

capped Collections比普通Collections的讀寫效率高

 

優化方案5:采用Profiling

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

 

轉載請注明出處:[http://www.cnblogs.com/dennisit/archive/2013/01/27/2879017.html]

在線交談

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM