一、索引
MongoDB提供了多樣性的索引支持索引信息被保存在system.indexes中且默認總是為_id
創建索引。
1、基礎索引
在字段age上創建索引1(升序);-1(降序)
上例顯示出來的一共有2個索引其中_id是創建表的時候自動創建的索引此索引是不能
夠刪除的。
當系統已有大量數據時創建索引就是個非常耗時的活我們可以在后臺執行只需指定
“backgroud:true”即可。
db.stu.ensureIndex({age:1},{background:1})
2、文檔索引
索引可以任何類型的字段甚至文檔
db.stu.insert({_id:3,name:'user2',age:12,addr:{city:'beijing',state:"BJ"}}) db.stu.insert({_id:4,name:'user2',age:12,addr:{city:'shanghai',state:"SH"}}) db.stu.ensureIndex({addr:1})
下面這個查詢將會用到我們剛剛建立的索引
db.stu.find({addr:{city:'beijing',state:'BJ'}}) "_id" : 3, "name" : "user2", "age" : 12, "addr" : { "city" : "beijing", "state" : "BJ" } }
而下面的查詢卻不能查到結果
db.stu.find({addr:{state:'BJ',city:'beijing'}})
3、組合索引
跟其它數據庫產品一樣MongoDB也是有組合索引的下面我們將在addr.city和addr.state
上建立組合索引。當創建組合索引時字段后面的1表示升序-1表示降序是用1還是
用-1主要是跟排序的時候或指定范圍內查詢的時候有關的。
db.stu.ensureIndex({'addr.city':1,'addr.state':1})
下面的查詢都用到了這個索引
4、唯一索引
只需在ensureIndex命令中指定”unique:true”即可創建唯一索引。
db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
當建唯一索引時如果表中有2條一模一模的數據就建立不了唯一索引。
5、強制使用索引
hint命令可以強制使用某個索引。
db.stu.ensureIndex({name:1,age:1})
則下面不能使用索引
使用hint強制使用索引
6、刪除索引
#刪除t3 表中的所有索引 db.t3.dropIndexes() #刪除t4 表中的firstname 索引 db.t4.dropIndex({firstname: 1})
二、explain執行計劃
MongoDB提供了一個explain命令讓我們獲知系統如何處理查詢請求。利用explain命令
我們可以很好地觀察系統如何使用索引來加快檢索同時可以針對性優化索引。
幾個關鍵的字段說明:
cursor:返回游標類型(BasicCursor或BtreeCursor)
nscanned:被掃描的文檔數量
n:返回的文檔數量
millis:耗時(毫秒)
indexBounds:所使用的索引
三、優化器profile
在MySQL中慢查詢日志是經常作為我們優化數據庫的依據那在MongoDB中是否有類似
的功能呢?答案是肯定的那就是MongoDBDatabaseProfiler。所以MongoDB不僅有而且
還有一些比MySQL的SlowQueryLog更詳細的信息。
1、開啟Profiling功能
有兩種方式可以控制Profiling的開關和級別第一種是直接在啟動參數里直接進行設置。
啟動MongoDB時加上–profile=級別即可。
也可以在客戶端調用db.setProfilingLevel(級別)命令來實時配置Profiler信息保存在
system.profile中。我們可以通過db.getProfilingLevel()命令來獲取當前的Profile級別。
profile的級別可以取012三個值他們表示的意義如下
0–不開啟
1–記錄慢命令(默認為>100ms)
2–記錄所有命令
Profile記錄在級別1時會記錄慢命令那么這個慢的定義是什么?上面我們說到其默認為
100ms當然有默認就有設置其設置方法和級別一樣有兩種一種是通過添加–slowms啟
動參數配置。第二種是調用db.setProfilingLevel時加上第二個參數
db.setProfilingLevel(1,10);
2、查詢Profiling記錄
與MySQL的慢查詢日志不同MongoDBProfile記錄是直接存在系統db里的記錄位置
system.profile所以我們只要查詢這個Collection的記錄就可以獲取到我們的Profile記
錄了。列出執行時間長于某一限度(5ms)的Profile記錄
db.system.profile.find( { millis : { $gt : 5 } } )
{ "op" : "command", "ns" : "test.$cmd", "command" : { "count" : "orders", "query" : { }, "fields" : { } }, "ntoreturn" : 1, "keyUpdates" : 0, "numYield" : 0, "lockStats" : { "timeLockedMicros" : { "r" : NumberLong(11494), "w" : NumberLong(0) }, "timeAcquiringMicros" : { "r" : NumberLong(4), "w" : NumberLong(5) } }, "responseLength" : 48, "millis" : 11, "ts" : ISODate("2013-11-16T13:52:38.391Z"), "client" : "127.0.0.1", "allUsers" : [ ], "user" : "" }
查詢最新的一條可以使用如下命令
db.system.profile.find().sort({$natural:-1}).limit(1)
MongoDBShell還提供了一個比較簡潔的命令showprofile可列出最近5條執行時間超過
1ms的Profile記錄。
Profiling功能肯定是會影響效率的但是不太嚴重原因是他使用的是system.profile來記
錄而system.profile是一個cappedcollection這種collection在操作上有一些限制和特點
但是效率更高。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。