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

首頁 > 數據庫 > MongoDB > 正文

MongoDB的索引

2020-10-29 18:46:47
字體:
來源:轉載
供稿:網友

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、內存和磁盤使用率都普遍的增高。

第二步:查詢用戶名為“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)、多鍵索引:為數組中的多個值建立索引以實現高效查詢。

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

 ?、?、不能指定片鍵作為多鍵索引

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

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

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”,然后重新創建所有索引

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产丝袜精品第一页| 色老头一区二区三区| 欧美日韩国产成人| 欧美性xxxx极品高清hd直播| 色综合天天综合网国产成人网| 亚洲国产欧美久久| 国产精品露脸av在线| 久久精品久久久久| 久久露脸国产精品| 国产一区二区三区高清在线观看| 成人妇女免费播放久久久| 亚洲视频axxx| 日韩网站免费观看高清| 亚洲福利视频网| 尤物yw午夜国产精品视频明星| 国产不卡av在线免费观看| 伊人伊成久久人综合网站| 青青草原成人在线视频| 91精品视频播放| 国产区精品视频| 亚洲qvod图片区电影| 精品国偷自产在线视频| 亚洲第一二三四五区| 日韩欧美极品在线观看| 国产美女扒开尿口久久久| 亚洲www在线| 欧美激情二区三区| 91最新在线免费观看| 国产欧美亚洲视频| 日韩一区视频在线| 久久免费在线观看| 欧美疯狂性受xxxxx另类| 日韩美女av在线| 亚洲精品一区在线观看香蕉| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲精品第一国产综合精品| 日本久久精品视频| 中文字幕综合在线| 国产欧美日韩中文| 亚洲国产古装精品网站| 亚洲最大av在线| 日韩专区在线播放| 92裸体在线视频网站| 国产日韩欧美在线看| 91精品久久久久久久久青青| 欧美高清在线播放| 亚洲国产成人精品久久久国产成人一区| 成人网在线视频| 色视频www在线播放国产成人| 亚洲欧美日韩网| 91性高湖久久久久久久久_久久99| 欧美午夜丰满在线18影院| 欧美天天综合色影久久精品| 国产www精品| 日韩精品中文字幕视频在线| 欧美国产极速在线| 欧美激情奇米色| 亚洲女在线观看| 中文字幕日韩精品在线观看| 亚洲另类欧美自拍| 热99精品里视频精品| 欧美又大粗又爽又黄大片视频| 亚洲性猛交xxxxwww| 欧美成人在线网站| 亚洲一区亚洲二区亚洲三区| 一区二区三区国产在线观看| 国产精品久久久久久久久影视| 92福利视频午夜1000合集在线观看| 日韩精品视频三区| 亚洲精品视频免费在线观看| www.国产一区| 久久精品国产精品亚洲| 日韩中文字幕网站| 69**夜色精品国产69乱| 亚洲影院在线看| 精品国产区一区二区三区在线观看| 欧美激情一区二区三区高清视频| 亚洲另类激情图| 精品中文字幕乱| 久热在线中文字幕色999舞| 日韩av免费在线播放| 丝袜一区二区三区| 亚洲人成网站777色婷婷| 日韩欧美aⅴ综合网站发布| 米奇精品一区二区三区在线观看| 久久免费观看视频| 一区二区三区视频免费在线观看| 国产精品高潮呻吟久久av黑人| 色噜噜狠狠狠综合曰曰曰88av| 亚洲欧美国产制服动漫| 少妇av一区二区三区| 日韩av电影手机在线| 69av在线播放| 91香蕉国产在线观看| 国产精品99久久久久久久久久久久| 91经典在线视频| 91精品91久久久久久| 日韩毛片在线观看| 国产精品视频久久久| 97精品视频在线观看| x99av成人免费| 国产日韩欧美日韩大片| 92版电视剧仙鹤神针在线观看| 国产精品福利在线| 亚洲伊人第一页| 亚洲激情电影中文字幕| 欧美野外wwwxxx| 亚洲午夜激情免费视频| 久久在线视频在线| 最近免费中文字幕视频2019| 全亚洲最色的网站在线观看| 97视频在线播放| 国产精品成人播放| 日韩精品在线免费播放| 久久久免费高清电视剧观看| 91网站在线看| 亚洲成色777777女色窝| 高清一区二区三区四区五区| 青青久久av北条麻妃海外网| 欧美精品中文字幕一区| 欧美成人亚洲成人日韩成人| 日韩成人高清在线| 欧美激情精品久久久久久免费印度| 亚洲码在线观看| 国产精品免费观看在线| 欧美综合激情网| 欧日韩在线观看| 久久久99久久精品女同性| 91久久精品日日躁夜夜躁国产| 亚洲第一精品自拍| 亚洲自拍欧美色图| 91久久久久久久久久| 国产噜噜噜噜噜久久久久久久久| 久久精品视频99| 国产亚洲精品一区二区| 91免费人成网站在线观看18| 亚洲男子天堂网| 亚洲人成电影网站色…| 米奇精品一区二区三区在线观看| 日韩欧美在线视频| 久久av在线播放| 综合136福利视频在线| 亚洲国产成人久久| 亚洲国产精品一区二区三区| 久久久精品久久| 国产精品亚洲欧美导航| 国产精品盗摄久久久| 欧美有码在线视频| 国产精品一区二区3区| 色综合色综合久久综合频道88| 国产精品久久久久久久久粉嫩av| 国产成人91久久精品| 欧美一区二区三区艳史| 亚洲精品aⅴ中文字幕乱码| 国产成人精品网站| 亚洲偷熟乱区亚洲香蕉av| 成人免费视频网| 亚洲免费小视频| 国产美女久久久| 狠狠久久五月精品中文字幕| 成人字幕网zmw| 久久久久久久久久久人体| 午夜精品久久久久久久男人的天堂| 亚洲欧美另类国产|