MongoDB 提供了多樣性的索引支持,索引信息被保存在system.indexes 中,且默認總是為_id創(chuàng)建索引,它的索引使用基本和MySQL 等關系型數(shù)據(jù)庫一樣。其實可以這樣說說,索引是凌駕于數(shù)據(jù)存儲系統(tǒng)之上的另一層系統(tǒng),所以各種結構迥異的存儲都有相同或相似的索引實現(xiàn)及使用接口并不足為 奇。
創(chuàng)新互聯(lián)主營文昌網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,App定制開發(fā),文昌h5微信小程序定制開發(fā)搭建,文昌網(wǎng)站營銷推廣歡迎文昌等地區(qū)企業(yè)咨詢
在字段age 上創(chuàng)建索引,1(升序);-1(降序):
db.users.ensureIndex({age:1})
_id 是創(chuàng)建表的時候自動創(chuàng)建的索引,此索引是不能夠刪除的。當系統(tǒng)已有大量數(shù)據(jù)時,創(chuàng)建索引就是個非常耗時的活,我們可以在后臺執(zhí)行,只需指定“backgroud:true”即可。
db.users.ensureIndex({age:1} , {backgroud:true})
索引可以任何類型的字段,甚至文檔:
db.factories.insert( { name: "wwl", addr: { city: "Beijing", state: "BJ" } } );
在addr 列上創(chuàng)建索引
db.factories.ensureIndex( { addr : 1 } );
下面這個查詢將會用到我們剛剛建立的索引
db.factories.find( { addr: { city: "Beijing", state: "BJ" } } );
但是下面這個查詢將不會用到索引,因為查詢的順序跟索引建立的順序不一樣
db.factories.find( { addr: { state: "BJ" , city: "Beijing"} } );
跟其它數(shù)據(jù)庫產(chǎn)品一樣,MongoDB 也是有組合索引的,下面我們將在addr.city 和addr.state上建立組合索引。當創(chuàng)建組合索引時,字段后面的1 表示升序,-1 表示降序,是用1 還是用-1 主要是跟排序的時候或指定范圍內(nèi)查詢 的時候有關的。
db.factories.ensureIndex( { "addr.city" : 1, "addr.state" : 1 } );
下面的查詢都用到了這個索引
db.factories.find( { "addr.city" : "Beijing", "addr.state" : "BJ" } );
db.factories.find( { "addr.city" : "Beijing" } );
db.factories.find().sort( { "addr.city" : 1, "addr.state" : 1 } );
db.factories.find().sort( { "addr.city" : 1 } );
只需在ensureIndex 命令中指定”unique:true”即可創(chuàng)建唯一索引。例如,往表t4 中插入2 條記錄時候報錯。
db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
hint 命令可以強制使用某個索引。
db.t5.find({age:{$lt:30}}).hint({name:1, age:1}).explain()
刪除t3 表中的所有索引
db.t3.dropIndexes()
刪除t4 表中的firstname 索引
db.t4.dropIndex({firstname: 1})
MongoDB 提供了一個 explain 命令讓我們獲知系統(tǒng)如何處理查詢請求。利用 explain 命令,我們可以很好地觀察系統(tǒng)如何使用索引來加快檢索,同時可以針對性優(yōu)化索引。
db.sang_collect.find({x:1}).explain()
# 返回值, 在python中運行
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "sang.sang_collect",
"indexFilterSet" : false,
"parsedQuery" : {
"x" : {
"$eq" : 1.0
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"x" : {
"$eq" : 1.0
}
},
"direction" : "forward"
},
"rejectedPlans" : []
},
"serverInfo" : {
"host" : "localhost.localdomain",
"port" : 27017,
"version" : "3.4.9",
"gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e"
},
"ok" : 1.0
}
字段說明:
executionStats會返回最佳執(zhí)行計劃的一些統(tǒng)計信息,如下:
db.sang_collect.find({x:1}).explain('executionStats')
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "sang.sang_collect",
"indexFilterSet" : false,
"parsedQuery" : {},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : []
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 10000,
"executionTimeMillis" : 4,
"totalKeysExamined" : 0,
"totalDocsExamined" : 10000,
"executionStages" : {
"stage" : "COLLSCAN",
"nReturned" : 10000,
"executionTimeMillisEstimate" : 0,
"works" : 10002,
"advanced" : 10000,
"needTime" : 1,
"needYield" : 0,
"saveState" : 78,
"restoreState" : 78,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 10000
}
},
"serverInfo" : {
"host" : "localhost.localdomain",
"port" : 27017,
"version" : "3.4.9",
"gitVersion" : "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e"
},
"ok" : 1.0
}
這里除了我們上文介紹到的一些參數(shù)之外,還多了executionStats參數(shù),含義如下:
在MySQL 中,慢查詢?nèi)罩臼墙?jīng)常作為我們優(yōu)化數(shù)據(jù)庫的依據(jù),那在MongoDB 中是否有類似的功能呢?答案是肯定的,那就是MongoDB Database Profiler。
有兩種方式可以控制 Profiling 的開關和級別,第一種是直接在啟動參數(shù)里直接進行設置。啟動MongoDB 時加上–profile=級別 即可。也可以在客戶端調(diào)用db.setProfilingLevel(級別) 命令來實時配置,Profiler 信息保存在system.profile 中。我們可以通過db.getProfilingLevel()命令來獲取當前的Profile 級別,類似如下操作:
db.setProfilingLevel(2);
上面profile 的級別可以取0,1,2 三個值,他們表示的意義如下:
0 – 不開啟
1 – 記錄慢命令 (默認為>100ms)
2 – 記錄所有命令
Profile 記錄在級別1 時會記錄慢命令,那么這個慢的定義是什么?上面我們說到其默認為100ms,當然有默認就有設置,其設置方法和級別一樣有兩種,一種是通過添加 –slowms 啟動參數(shù)配置。第二種是調(diào)用db.setProfilingLevel 時加上第二個參數(shù):
db.setProfilingLevel( level , slowms )
db.setProfilingLevel( 1 , 10 );
與MySQL 的慢查詢?nèi)罩静煌?,MongoDB Profile 記錄是直接存在系統(tǒng)db 里的,記錄位置system.profile ,所以,我們只要查詢這個Collection 的記錄就可以獲取到我們的 Profile 記錄了。列出執(zhí)行時間長于某一限度(5ms)的 Profile 記錄:
db.system.profile.find( { millis : { $gt : 5 } } )
MongoDB Shell 還提供了一個比較簡潔的命令show profile,可列出最近5 條執(zhí)行時間超過1ms 的 Profile 記錄。
創(chuàng)建索引, 當查詢的字段有2個時,數(shù)據(jù)量較大時,可以使用聯(lián)合索引
限定返回結果數(shù)
只查詢使用到的字段
采用capped collection
采用Server Side Code Execution
使用Hint,強制使用索引
采用Profiling
本文題目:MongoDB創(chuàng)建基礎索引、組合索引、唯一索引以及優(yōu)化
轉(zhuǎn)載來于:http://chinadenli.net/article32/godepc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器、面包屑導航、做網(wǎng)站、網(wǎng)站設計公司、網(wǎng)站設計、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)