亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

MongoDB的索引

2020-03-14 12:57:51
字體:
來源:轉載
供稿:網友

1、簡介

它就像是一本書的目錄,如果沒有它,我們就需要對整個書籍進行查找來獲取需要的結果,即所說的全盤掃描;

而有了目錄(索引)之后就可以通過它幫我們定位到目標所在的位置,快速的獲取我們想要的結果。

2、演示

第一步,向用戶集合users中插入100W條數據

var insertUsers = function() {  var start = new Date().getTime();  for (var i = 1; i <= 1000000; i++) {    db.users.insert({      "userid": i,      "username": "wjg" + i,      "age": Math.floor(Math.random() * 100), //年齡為0~99的隨機整數      "createdate": new Date()    })  }  var end = new Date().getTime();  print("插入100W條數據共耗時" + (end - start) / 1000 + "秒");}

LZ的渣渣I3和4G內存總共耗時了484.623秒,約8分多鐘。任務管理器里邊可以很清楚的看到當時CPU、內存和磁盤使用率都普遍的增高。

MongoDB,索引

第二步:查詢用戶名為“wjg465413”的文檔對象

db.users.find({username:"wjg465413"}).explain("allPlansExecution"){    "queryPlanner" : {        "plannerVersion" : 1,        "namespace" : "test.users",        "indexFilterSet" : false,        "parsedQuery" : {            "username" : {                "$eq" : "wjg465413"            }        },        "winningPlan" : {            "stage" : "COLLSCAN",            "filter" : {                "username" : {                    "$eq" : "wjg465413"                }            },            "direction" : "forward"        },        "rejectedPlans" : [ ]    },    "executionStats" : {        "executionSuccess" : true,        "nReturned" : 1,        "executionTimeMillis" : 865,        "totalKeysExamined" : 0,        "totalDocsExamined" : 1000000,        "executionStages" : {            "stage" : "COLLSCAN",            "filter" : {                "username" : {                    "$eq" : "wjg465413"                }            },            "nReturned" : 1,            "executionTimeMillisEstimate" : 770,            "works" : 1000002,            "advanced" : 1,            "needTime" : 1000000,            "needFetch" : 0,            "saveState" : 7813,            "restoreState" : 7813,            "isEOF" : 1,            "invalidates" : 0,            "direction" : "forward",            "docsExamined" : 1000000        },        "allPlansExecution" : [ ]    },    "serverInfo" : {        "host" : "Jack",        "port" : 27017,        "version" : "3.0.3",        "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"    },    "ok" : 1}

說明:這里的explain方法相當于查詢計劃,它會返回給你查詢過程的詳細信息。它的參數有三種模式:“queryPlanner”(查詢計劃[默認])、“executionStats”(執行狀態)和“allPlansExecution”(所有執行計劃),這里我們只關注它返回給我們的以下幾個信息。

"executionTimeMillis" : 865 //執行的毫秒數 注:如果你是第一次執行,可能會花費更長的時間"totalDocsExamined" : 1000000  //共檢查的文檔數

第三步:在用戶名“username”字段上加上索引

db.users.createIndex({ "username" : 1 }) 

重新執行上次的查詢操作

db.users.find({username:"wjg465413"}).explain("allPlansExecution"){    "queryPlanner" : {        "plannerVersion" : 1,        "namespace" : "test.users",        "indexFilterSet" : false,        "parsedQuery" : {            "username" : {                "$eq" : "wjg465413"            }        },        "winningPlan" : {            "stage" : "FETCH",            "inputStage" : {                "stage" : "IXSCAN",                "keyPattern" : {                    "username" : 1                },                "indexName" : "username_1",                "isMultiKey" : false,                "direction" : "forward",                "indexBounds" : {                    "username" : [                        "[/"wjg465413/", /"wjg465413/"]"                    ]                }            }        },        "rejectedPlans" : [ ]    },    "executionStats" : {        "executionSuccess" : true,        "nReturned" : 1,        "executionTimeMillis" : 53,        "totalKeysExamined" : 1,        "totalDocsExamined" : 1,        "executionStages" : {            "stage" : "FETCH",            "nReturned" : 1,            "executionTimeMillisEstimate" : 0,            "works" : 2,            "advanced" : 1,            "needTime" : 0,            "needFetch" : 0,            "saveState" : 0,            "restoreState" : 0,            "isEOF" : 1,            "invalidates" : 0,            "docsExamined" : 1,            "alreadyHasObj" : 0,            "inputStage" : {                "stage" : "IXSCAN",                "nReturned" : 1,                "executionTimeMillisEstimate" : 0,                "works" : 2,                "advanced" : 1,                "needTime" : 0,                "needFetch" : 0,                "saveState" : 0,                "restoreState" : 0,                "isEOF" : 1,                "invalidates" : 0,                "keyPattern" : {                    "username" : 1                },                "indexName" : "username_1",                "isMultiKey" : false,                "direction" : "forward",                "indexBounds" : {                    "username" : [                        "[/"wjg465413/", /"wjg465413/"]"                    ]                },                "keysExamined" : 1,                "dupsTested" : 0,                "dupsDropped" : 0,                "seenInvalidated" : 0,                "matchTested" : 0            }        },        "allPlansExecution" : [ ]    },    "serverInfo" : {        "host" : "Jack",        "port" : 27017,        "version" : "3.0.3",        "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"    },    "ok" : 1}

可以看到兩次的查詢計劃有很大的差別,我們還是著重看下那兩個屬性值。

 "executionTimeMillis" : 53  //執行的毫秒數 "totalDocsExamined" : 1  //共檢查的文檔數

加過索引之后查詢這個文檔所耗費的時間僅僅為53毫秒,并且掃描一次直接定位,性能提升了16倍。可見合理使用索引的重要性!

注:“_id”字段是Mongo為我們默認添加的索引,而且是唯一索引,保證了數據的唯一性,不可以移除。另外,使用limit(1)限制查詢結果的數量也可以提高查詢速度

3、索引的類型

a)、單一索引:可以在數據集上任意一個字段上建立索引,包括普通的屬性鍵、內嵌文檔以及內嵌文檔中的屬性鍵。

db.users.createIndex({ "username" : 1 })  //普通屬性鍵的索引//假設class是一個內嵌的文檔db.users.createIndex({ "class" : 1 })  //內嵌文檔的索引 db.users.createIndex({ "class.classname" : 1 })  //內嵌文檔中的屬性鍵索引

索引方向:1表示升序,-1表示降序

b)、復合索引:以多個屬性鍵為基礎而建立得索引

db.users.createIndex({ "username" : 1, "age" : -1, "userid" : 1 })  //在“username”、“age”和“userid”上建立復合索引

索引前綴:通過建立上邊的復合索引之后,Mongo就相當于同時擁有了三個索引一樣,分別是{"username" : 1},{"username" : 1, "age" : -1}和{"username" : 1, "age" : -1, "userid" : 1},但是像{"age" : -1},{"userid" : 1}或者{"age" : -1, "userid" : 1}這三個索引并不會起作用。所以它會使用包含了前綴(首個)的索引的作為復合索引

c)、多鍵索引:為數組中的多個值建立索引以實現高效查詢。

注:Ⅰ、不允許在多個數組上建立復合索引

 ?、颉⒉荒苤付ㄆI作為多鍵索引

 ?、?、哈希索引不能是多鍵

 ?、?、多鍵索引不支持覆蓋查詢

d)、地理空間索引和查詢:Mongo提供了兩種曲面類型的索引:2dsphere索引和2d索引。查詢類型包括:包含(inclusion),交叉(intersection)和接近(proximity)

e)、文本索引:用來支持查詢包含了字符串或者字符串數組的文檔

db.users.createIndex({"username" : "text"})

注:文本索引不支持排序并且一個復合文本索引不能再包含其他任何索引了

f)、哈希索引:它可以在使用了哈希片鍵進行分片的數據集上進行索引,支持相等查詢,但是不支持范圍查詢

 db.users.createIndex({"username" : "hashed"})

4、索引特性

a)、TTL(Time-To-Live)索引:是一種具有生命周期的索引,它允許為每一個文檔設置一個超時時間

 db.users.createIndex({ "createdate" : 1 },{ "expireAfterSecs" : 60*60*24 }) 

說明:在“createdate”字段上建立一個TTL索引,當這個自段存在并且是日期類型,當服務器時間比“createdate”字段的時間晚60*60*24秒,即24小時時,文檔就會被刪除

b)、唯一索引:確保集合的每一個文檔的指定鍵都有唯一值

db.users.createIndex({"username" : 1}, {"unique" : true})

c)、稀疏索引:Mongo里邊的null會被看做值,如果有一個可能存在也可能不存在的字段,我們可以使用稀疏索引

db.users.createIndex({"age" : 1},{"sparse" : true})

4、索引操作

a)、查看所有索引

db.users.getIndexes()

b)、移除索引

db.users.dropIndex({"createdate1" : 1 })

c)、移除所有索引

db.users.dropIndexes()

d)、重建索引

db.users.reIndex()

說明:該操作會先刪除所有索引,包括“_id”,然后重新創建所有索引

 

注:相關教程知識閱讀請移步到MongoDB頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人人爽久久涩噜噜噜网站| 亚洲第一精品电影| 成人激情视频在线播放| 爽爽爽爽爽爽爽成人免费观看| 日韩欧美国产免费播放| 欧美激情久久久久| 亚洲高清av在线| 国产一区二区三区在线观看网站| 国产精品一区二区久久久| 色妞色视频一区二区三区四区| 欧美日韩激情小视频| 久久成年人视频| 久久久噜久噜久久综合| 久久久久久亚洲精品| 日本久久久久久| 最好看的2019年中文视频| 亚洲一品av免费观看| 精品中文字幕乱| 国内免费精品永久在线视频| 久久久精品免费| 日韩精品在线影院| 亚洲电影第1页| 久久视频国产精品免费视频在线| 久久免费成人精品视频| 激情av一区二区| …久久精品99久久香蕉国产| 91国产美女在线观看| 国产精品久久久久久久av大片| 日韩成人av在线播放| 欧美极品少妇全裸体| 在线a欧美视频| 精品亚洲va在线va天堂资源站| 国产精品久久电影观看| 久久在精品线影院精品国产| 欧美在线播放视频| 亚洲国产日韩欧美在线99| 日韩av第一页| 国内外成人免费激情在线视频网站| 亚洲xxxx3d| 色综合亚洲精品激情狠狠| 欧美影院在线播放| 欧美与黑人午夜性猛交久久久| 亚洲国产精品中文| 日韩精品亚洲元码| 国产精品18久久久久久麻辣| 国产精品狼人色视频一区| 69国产精品成人在线播放| 国产一区二区三区在线看| 国产亚洲美女精品久久久| 精品久久久999| 国产精品27p| 国产成人精品日本亚洲| 成人在线小视频| 国产91成人在在线播放| 国产精品69久久久久| 国产视频精品免费播放| 亚洲a∨日韩av高清在线观看| 亚洲欧美自拍一区| 日韩中文在线观看| 亚洲欧美日韩国产中文专区| 欧美在线www| 成人h视频在线| 最近2019中文免费高清视频观看www99| 中文字幕亚洲无线码在线一区| 欧美激情一级欧美精品| 亚洲欧洲国产一区| 中文字幕日韩在线播放| 日韩精品视频在线播放| 亚洲人成电影网站| 欧美黑人巨大xxx极品| 欧美日韩另类视频| 亚洲a区在线视频| 国产亚洲欧美视频| 亚洲电影第1页| 亚洲精品自拍视频| 亚洲成**性毛茸茸| 日韩欧美精品网址| 亚洲理论在线a中文字幕| 国产精品高清网站| 亚洲第一福利视频| 亚洲影院高清在线| 在线播放精品一区二区三区| 亚洲精品成人免费| 九九视频这里只有精品| 国产欧亚日韩视频| 日韩在线观看av| 成人精品视频在线| 欧美黄色免费网站| 91在线观看免费高清完整版在线观看| 欧美日韩电影在线观看| 成人午夜在线视频一区| 国产成人激情小视频| 少妇av一区二区三区| 亚洲欧美在线播放| 国语自产精品视频在线看一大j8| 久久精品中文字幕一区| 亚洲精品久久久一区二区三区| 欧美综合一区第一页| 日本一欧美一欧美一亚洲视频| 国产精品成人aaaaa网站| 亚洲精品久久视频| 欧美一区二区三区图| 欧美最近摘花xxxx摘花| 国色天香2019中文字幕在线观看| 国产精品久久久av久久久| 日韩美女写真福利在线观看| 国产精品久久久久av免费| 青青在线视频一区二区三区| 色偷偷av一区二区三区乱| 国产成人精品久久久| 国产精品视频1区| 久久精品中文字幕| 国产丝袜一区视频在线观看| 日韩在线中文字| 91亚洲午夜在线| 一本大道久久加勒比香蕉| 最新的欧美黄色| 国产成人一区三区| 久久视频免费在线播放| 136fldh精品导航福利| 成人日韩av在线| 日韩网站在线观看| 欧美精品videofree1080p| www.亚洲天堂| 欧美专区福利在线| 亚洲图片欧洲图片av| 日韩最新中文字幕电影免费看| 亚洲一区二区三区sesese| 成年人精品视频| 欧美日韩福利视频| 91精品视频专区| 国产精品丝袜久久久久久高清| 欧美激情一区二区久久久| 丝袜亚洲欧美日韩综合| 精品色蜜蜜精品视频在线观看| 国语自产精品视频在免费| 亚洲中国色老太| 久久精品国产99国产精品澳门| 一区三区二区视频| 欧美成人在线网站| 欧美床上激情在线观看| 欧美日韩福利在线观看| 国产精品午夜视频| 欧美中在线观看| 国产成人精品网站| 亚洲精品美女久久久久| 久久久久免费精品国产| 久久6免费高清热精品| 57pao精品| 国产精品va在线播放| 久久久www成人免费精品张筱雨| 亚洲区一区二区| 国内精品久久影院| 国产成人亚洲精品| 久久久精品国产网站| 日韩精品免费在线播放| 久久久免费精品| 91色琪琪电影亚洲精品久久| 日本精品久久久| 久久99久久99精品免观看粉嫩| 欧美大荫蒂xxx| 国产精品视频自拍| 97婷婷大伊香蕉精品视频| 91欧美激情另类亚洲|