建立索引是優化數據庫最直接的手段.遵循以下索引優化原則,可以建立比較高效和合理的索引.
在索引中包含條件的所有列,可以使用索引形成的屏蔽來拒絕結果集中不合適的行
對於需要排序的引用列,適當地創建索引可以避免排序
考慮到管理上的開銷,應避免在索引中使用多於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]