標籤:效能最佳化 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在操作上有一些限制和特點,但是效率更高.
本文出自 “ghost” 部落格,請務必保留此出處http://caizi.blog.51cto.com/5234706/1542480