成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

帶你聊聊MongoDB中豐富的索引類型

本篇文章帶你了解MongoDB,介紹一下MongoDB中豐富的索引類型,希望對大家有所幫助!

帶你聊聊MongoDB中豐富的索引類型

MongoDB的索引和MySql的索引的作用和優(yōu)化要遵循的原則基本相似,MySql索引類型基本可以區(qū)分為:

  • 單鍵索引 – 聯(lián)合索引
  • 主鍵索引(聚簇索引) – 非主鍵索引(非聚簇索引)

MongoDB中除了這些基礎(chǔ)的分類之外,還有一些特殊的索引類型,如: 數(shù)組索引 | 稀疏索引 | 地理空間索引 | TTL索引等.

為了下面方便測試我們使用腳本插入以下數(shù)據(jù)

for(var i = 0;i < 100000;i++){     db.users.insertOne({         username: "user"+i,         age: Math.random() * 100,         sex: i % 2,         phone: 18468150001+i     }); }

單鍵索引

單鍵索引即索引的字段只有一個(gè),是最基礎(chǔ)的索引方式.

在集合中使用username字段,創(chuàng)建一個(gè)單鍵索引,MongoDB會自動(dòng)將這個(gè)索引命名為username_1

db.users.createIndex({username:1}) 'username_1'

在創(chuàng)建索引后查看一下使用username字段的查詢計(jì)劃,stageIXSCAN代表使用使用了索引掃描

db.users.find({username:"user40001"}).explain() {     queryPlanner:     {       winningPlan:       {          ......         stage: 'FETCH',         inputStage:          {             stage: 'IXSCAN',            keyPattern: { username: 1 },            indexName: 'username_1',            ......         }       }      rejectedPlans: [] ,    },    ......    ok: 1  }

在索引優(yōu)化的原則當(dāng)中,有很重要的原則就是索引要建立在基數(shù)高的的字段上,所謂基數(shù)就是一個(gè)字段上不重復(fù)數(shù)值的個(gè)數(shù),即我們在創(chuàng)建users集合時(shí)年齡出現(xiàn)的數(shù)值是0-99那么age這個(gè)字段將會有100個(gè)不重復(fù)的數(shù)值,即age字段的基數(shù)為100,而sex這個(gè)字段只會出現(xiàn)0 | 1這個(gè)兩個(gè)值,即sex字段的基礎(chǔ)是2,這是一個(gè)相當(dāng)?shù)偷幕鶖?shù),在這種情況下,索引的效率并不高并且會導(dǎo)致索引失效.

下面就船艦一個(gè)sex字段索引,來查詢執(zhí)行計(jì)劃會發(fā)現(xiàn),查詢時(shí)是走的全表掃描,而沒有走相關(guān)索引.

db.users.createIndex({sex:1}) 'sex_1'  db.users.find({sex:1}).explain() {    queryPlanner:    {       ......      winningPlan:       {          stage: 'COLLSCAN',         filter: { sex: { '$eq': 1 } },         direction: 'forward'       },      rejectedPlans: []    },   ......   ok: 1  }

聯(lián)合索引

聯(lián)合索引即索引上會有多個(gè)字段,下面使用agesex兩個(gè)字段創(chuàng)建一個(gè)索引

db.users.createIndex({age:1,sex:1}) 'age_1_sex_1'

然后我們使用這兩個(gè)字段進(jìn)行一次查詢,查看執(zhí)行計(jì)劃,順利地走了這條索引

db.users.find({age:23,sex:1}).explain() {    queryPlanner:    {       ......      winningPlan:       {          stage: 'FETCH',         inputStage:          {             stage: 'IXSCAN',            keyPattern: { age: 1, sex: 1 },            indexName: 'age_1_sex_1',            .......            indexBounds: { age: [ '[23, 23]' ], sex: [ '[1, 1]' ] }          }       },      rejectedPlans: [],    },   ......   ok: 1   }

數(shù)組索引

數(shù)組索引就是對數(shù)組字段創(chuàng)建索引,也叫做多值索引,下面為了測試將users集合中的數(shù)據(jù)增加一部分?jǐn)?shù)組字段.

db.users.updateOne({username:"user1"},{$set:{hobby:["唱歌","籃球","rap"]}}) ......

創(chuàng)建數(shù)組索引并進(jìn)行查看其執(zhí)行計(jì)劃,注意isMultiKey: true表示使用的索引是多值索引.

db.users.createIndex({hobby:1}) 'hobby_1'  db.users.find({hobby:{$elemMatch:{$eq:"釣魚"}}}).explain() {     queryPlanner:     {       ......      winningPlan:       {          stage: 'FETCH',         filter: { hobby: { '$elemMatch': { '$eq': '釣魚' } } },         inputStage:          {             stage: 'IXSCAN',            keyPattern: { hobby: 1 },            indexName: 'hobby_1',            isMultiKey: true,            multiKeyPaths: { hobby: [ 'hobby' ] },            ......            indexBounds: { hobby: [ '["釣魚", "釣魚"]' ] } }           },      rejectedPlans: []    },   ......   ok: 1  }

數(shù)組索引相比于其它索引來說索引條目和體積必然呈倍數(shù)增加,例如平均每個(gè)文檔的hobby數(shù)組的size為10,那么這個(gè)集合的hobby數(shù)組索引的條目數(shù)量將是普通索引的10倍.

聯(lián)合數(shù)組索引

聯(lián)合數(shù)組索引就是含有數(shù)組字段的聯(lián)合索引,這種索引不支持一個(gè)索引中含有多個(gè)數(shù)組字段,即一個(gè)索引中最多能有一個(gè)數(shù)組字段,這是為了避免索引條目爆炸式增長,假設(shè)一個(gè)索引中有兩個(gè)數(shù)組字段,那么這個(gè)索引條目的數(shù)量將是普通索引的n*m倍

地理空間索引

在原先的users集合上,增加一些地理信息

for(var i = 0;i < 100000;i++){     db.users.updateOne(     {username:"user"+i},     {         $set:{             location:{                 type: "Point",                 coordinates: [100+Math.random() * 4,40+Math.random() * 3]             }         }     }); }

創(chuàng)建一個(gè)二維空間索引

db.users.createIndex({location:"2dsphere"}) 'location_2dsphere'  //查詢500米內(nèi)的人 db.users.find({   location:{     $near:{       $geometry:{type:"Point",coordinates:[102,41.5]},       $maxDistance:500     }   } })

地理空間索引的type有很多包含Ponit(點(diǎn)) | LineString(線) | Polygon(多邊形)

TTL索引

TTL的全拼是time to live,主要是用于過期數(shù)據(jù)自動(dòng)刪除,使用這種索引需要在文檔中聲明一個(gè)時(shí)間類型的字段,然后為這個(gè)字段創(chuàng)建TTL索引的時(shí)候還需要設(shè)置一個(gè)expireAfterSeconds過期時(shí)間單位為秒,創(chuàng)建完成后MongoDB會定期對集合中的數(shù)據(jù)進(jìn)行檢查,當(dāng)出現(xiàn):

當(dāng)前時(shí)間?TTL索引字段時(shí)間>expireAfterSrconds當(dāng)前時(shí)間 – TTL索引字段時(shí)間 > expireAfterSrconds

MongoDB將會自動(dòng)將這些文檔刪除,這種索引還有以下這些要求:

  • TTL索引只能有一個(gè)字段,沒有聯(lián)合TTL索引
  • TTL不能用于固定集合
  • TTL索引是逐個(gè)遍歷后,發(fā)現(xiàn)滿足刪除條件會使用delete函數(shù)刪除,效率并不高

首先在我們文檔上增減一個(gè)時(shí)間字段

for(var i = 90000;i < 100000;i++){     db.users.updateOne(     {username:"user"+i},     {         $set:{             createdDate:new Date()         }     }); }

創(chuàng)建一個(gè)TTL索引并且設(shè)定過期時(shí)間為60s,待過60s后查詢,會發(fā)現(xiàn)這些數(shù)據(jù)已經(jīng)不存在

db.users.createIndex({createdDate:1},{expireAfterSeconds:60}) 'createdDate_1'

另外還可以用CollMod命令更改TTL索引的過期時(shí)間

db.runCommand({   collMod:"users",   index:{     keyPattern:{createdDate:1},     expireAfterSeconds:120   } })  { expireAfterSeconds_old: 60, expireAfterSeconds_new: 120, ok: 1 }

條件索引

條件索引也叫部分索引(partial),只對滿足條件的數(shù)據(jù)進(jìn)行建立索引.

只對50歲以上的user進(jìn)行建立username_1索引,查看執(zhí)行計(jì)劃會發(fā)現(xiàn)isPartial這個(gè)字段會變成true

db.users.createIndex({username:1},{partialFilterExpression:{     age:{$gt:50}   }}) 'username_1'  db.users.find({$and:[{username:"user4"},{age:60}]}).explain() {    queryPlanner:    {       ......      winningPlan:       {          stage: 'FETCH',         filter: { age: { '$eq': 60 } },         inputStage:          {             stage: 'IXSCAN',            keyPattern: { username: 1 },            indexName: 'username_1',            ......            isPartial: true,            ......          }       },      rejectedPlans: []    },   ......   ok: 1  }

稀疏索引

一般的索引會根據(jù)某個(gè)字段為整個(gè)集合創(chuàng)建一個(gè)索引,即使某個(gè)文檔不存這個(gè)字段,那么這個(gè)索引會把這個(gè)文檔的這個(gè)字段當(dāng)作null建立在索引當(dāng)中.

稀疏索引不會對文檔中不存在的字段建立索引,如果這個(gè)字段存在但是為null時(shí),則會創(chuàng)建索引.

下面給users集合中的部分?jǐn)?shù)據(jù)創(chuàng)建稀疏索引

for(var i = 5000;i < 10000;i++){   if(i < 9000){     db.users.updateOne(       {username:"user"+i},       { $set:{email:(120000000+i)+"@qq.email"}}     )   }else{     db.users.updateOne(       {username:"user"+i},       { $set:{email:null}}     )   } }

當(dāng)不建立索引使用{email:null}條件進(jìn)行查詢時(shí),我們會發(fā)現(xiàn)查出來的文檔包含沒有email字段的文檔

db.users.find({email:null}) {    _id: ObjectId("61bdc01ba59136670f6536fd"),   username: 'user0',   age: 64.41483801726282,   sex: 0,   phone: 18468150001,   location:    {      type: 'Point',     coordinates: [ 101.42490900320335, 42.2576650823515 ]    }  } ......

然后對email這個(gè)字段創(chuàng)建一個(gè)稀疏索引使用{email:null}條件進(jìn)行查詢,則發(fā)現(xiàn)查詢來的文檔全部是email字段存在且為null的文檔.

db.users.createIndex({email:1},{sparse:true}); 'email_1'  db.users.find({email:null}).hint({email:1}) {    _id: ObjectId("61bdc12ca59136670f655a25"),   username: 'user9000',   age: 94.18397576757012,   sex: 0,   phone: 18468159001,   hobby: [ '釣魚', '乒乓球' ],   location:    {      type: 'Point',     coordinates: [ 101.25903151863596, 41.38450145025062 ]    },   email: null  } ......

文本索引

文本索引將建立索引的文檔字段先進(jìn)行分詞再進(jìn)行檢索,但是目前還不支持中文分詞.

下面增加兩個(gè)文本字段,創(chuàng)建一個(gè)聯(lián)合文本索引

db.blog.insertMany([   {title:"hello world",content:"mongodb is the best database"},   {title:"index",content:"efficient data structure"} ])  //創(chuàng)建索引 db.blog.createIndex({title:"text",content:"text"}) 'title_text_content_text' //使用文本索引查詢 db.blog.find({$text:{$search:"hello data"}}) {    _id: ObjectId("61c092268c4037d17827d977"),   title: 'index',   content: 'efficient data structure'  }, {    _id: ObjectId("61c092268c4037d17827d976"),   title: 'hello world',   content: 'mongodb is the best database'  }

唯一索引

唯一索引就是在建立索引地字段上不能出現(xiàn)重復(fù)元素,除了單字段唯一索引還有聯(lián)合唯一索引以及數(shù)組唯一索引(即數(shù)組之間不能有元素交集 )

//對title字段創(chuàng)建唯一索引 db.blog.createIndex({title:1},{unique:true}) 'title_1' //插入一個(gè)已經(jīng)存在的title值 db.blog.insertOne({title:"hello world",content:"mongodb is the best database"}) MongoServerError: E11000 duplicate key error collection: mock.blog index: title_1 dup key: { : "hello world" } //查看一下執(zhí)行計(jì)劃,isUnique為true db.blog.find({"title":"index"}).explain() {    queryPlanner:    {       ......      winningPlan:       {          stage: 'FETCH',         inputStage:          {             stage: 'IXSCAN',            keyPattern: { title: 1 },            indexName: 'title_1',            isMultiKey: false,            multiKeyPaths: { title: [] },            isUnique: true,            ......          }       },      rejectedPlans: []    },   .......   ok: 1  }

相關(guān)視頻教程推薦:《MongoDB教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
办公室被吃奶好爽在线观看| 综合在线视频精品专区| 国产肉体XXXX裸体137大胆| 98在线视频噜噜噜国产| 亚洲人成无码网站在线观看野花| 无码国产精品一区二区免费I6| 欧洲做爰XXXⅩ富婆视频| 久久人午夜亚洲精品无码区| 哈昂~哈昂够了太多太深| 国产96在线 | 国产| 办公室撕开奶罩揉吮奶头在线观看| A∨天堂亚洲区无码先锋影音| 野花社区影视在线WWW官网| 亚洲AV永久无码精品放毛片一 | 国产亚洲欧美日韩在线一区二区三| 成年女人毛片免费观看97| 999久久久国产精品| エロドラえもんCOM中文在线| 69国产成人综合久久精品| 一本久久伊人热热精品中文字幕| 亚洲大尺度无码专区尤物| 亚洲AVTV永久综合在线| 无遮挡粉嫩小泬久久久久久软件| 少妇性活BBBBBBBBB四川| 日本怡春院一区二区三区| 人妻丰满熟妇av无码区网站| 清纯校花挨脔日常H惩罚视频| 欧美另类VIDEOSSEXO潮| 欧美金妇欧美乱妇XXXX| 欧美熟女一区二区三区| 欧美人与动交视频播放| 熟女作爱一区二区视频| 我和岳M愉情XXXX| 无码人妻丰满熟妇啪啪7774| 双腿吊起揉捏花蒂| 亚洲精品乱码久久久久久自慰| 亚洲AV日韩AV高潮喷潮无码| 亚洲AV无码ⅤS国产AV| 又大又黄又粗又爽的免费视频| 永久亚洲成A人片777777| 啊灬啊灬啊灬快灬深用力| 国产精品嫩草影院AV| 国产未成满18禁止免费看| 久久久久人妻一区精品果冻| 老司机久久一区二区三区 | 国产成人免费AV一区二区午夜 | 在线麻豆精东9制片厂AV影现网| 永久免费观看午夜成人网站| 中国成熟妇女毛茸茸| 粗长挺进新婚人妻小怡| 国产超碰AV人人做人人爽| 国产精品乱码高清在线观看| 国产熟女高潮精品视频区| 鲁大师在线影院免费观看| 男人的又粗又长又硬有白色液体| 欧美性极品少妇精品网站| 小诗的公交车日记免费读| 亚洲乱码中文论理电影| 曰韩人妻无码一区二区三区综合部| 成年女人粗暴毛片免费观看| 精品久久久久久亚洲中文字幕| 久久久久亚洲AV无码永不 | 暴躁少女CSGO图片| 九九爱WWW免费人成视频| 麻豆国产在线精品国偷产拍 | 男女超爽视频免费播放| 无码精品人妻一区二区三区老牛| 18VIDEOSEX性欧美| 成人午夜亚洲精品无码区毛片| 国产精品VA在线观看无码| 狠狠无码人妻精品一区二区蜜桃| 久久久久久AV无码免费网站下载| 欧美 日韩 高清 国产AⅤ一区| 三上悠亚SSNI452内衣模特| 亚洲AⅤ优女AV综合久久久| FREE性玩弄少妇HD| 国产成年无码久久久久下载| 麻豆成人久久精品二区三区免费| 天堂久久久久VA久久久久| 亚洲А∨天堂久久精品PPYPP| 又色又爽又黄的视频软件APP| 国产精品AV无码毛片久久| 欧美黑人巨大VIDEOS精品| 亚洲欧美日韩中文字幕在线一区| 2022久久国产精品免费热麻豆| 国产一区二区精品丝袜| 免费观看的AV毛片的网站| 上面一个摸下面一个手念什么| 亚洲AV中文乱码一区二| 大尺度一对一视频聊天软件| 好大好硬好深好爽想要20P| 妺妺窝人销魂体色www| 亚洲高清专区日韩精品| MD豆传媒一二三区进站口在线| 国产精品国产三级国产A| 欧美日产欧美日产国产精品| 亚洲综合AV永久无码精品一区二 | 欧美国产成人精品一区二区三区| 亚洲色精品三区二区一区| WWXX在线观看免费| 国产日产欧产精品品不卡| 免费女性裸体啪啪无遮挡网站| 亚洲丰满性熟妇ⅩXXOOO太阳| 隔着肚兜偷揉酥乳含乳子| 久久人人爽人人爽人人片DVD| 小浪货腿打开水真多真紧| 给丰满少妇按摩到高潮| 人妻少妇看A偷人无码| 中文字幕在线播放| 乱码一卡二卡新区永久入口| 亚洲日韩精品A∨片无码加勒比| 国产又粗又黄又爽的大片| 无码精品人妻一区二区三区在线 | 久久精品国产亚洲AV蜜桃AV| 日本成熟少妇喷浆在线观看| 亚洲乱色熟女一区二区三区蜜臀 | 麻豆国产AV超爽剧情系列| 亚洲性色AV日韩在线观看| 国产AV日韩A∨亚洲AV电影| 美女高潮潮喷出白浆视频| 午夜精品久久久久9999| 国产夫妻CCCXXX久久久| 女人另类牲交ZOZOZO| 在线天堂资源WWW在线中文| 久久亚洲色WWW成人欧美| 无码精品人妻一区二区三区网站| 东京热TOKYO综合久久精品 | 国产精品青青在线观看爽香蕉| 特级毛片爽WWW免费版| 50妺妺窝人体色聚窝窝www| 老熟女奶头好大呀| 中国熟妇内谢69XXXXX| 韩国精品一区二区无码视频| 西西人体44WWW高清大胆| XXXXX18日本人HDXX| 欧美一区二区放荡人妇| 亚洲一区二区三区成人网站| 精品人妻系列无码人妻在线不 | JAPANESE強姦するAV| 人妻蜜と1~4中文字幕月野定规 | 日产国产欧美精品另类小说| 大哥的女人中文字幕完整版| 少妇午夜AV一区| 国产手机在线精品| 亚洲精品亚洲人成在线观看| 久久精品国产色蜜蜜麻豆| 一夲道中文字幕AV高清片| 国精产品W灬源码1688网站| 上课我穿超短裙被同桌摸出水 | 久久 国产 尿 小便 嘘嘘| 一本大道久久A久久综合| 蜜桃AV噜噜一区二区三区| 亚洲精品456在线播放| 国产精品亚洲片在线| 色久综合网精品一区二区| 国产成人亚洲精品无码H在线| 午夜福利1000 92免费| 狠狠躁夜夜躁青青草原| 午夜A级理论片在线播放不卡| 国产亚洲欧美日韩二三线| 亚洲熟妇AV综合网五月| 免费AV永久免费网址| VPSWINDOWS另类乱| 四虎永久在线精品免费一区二区 | 亚洲AV无码不卡一区二区三区| 久久成人国产精品| 亚洲成AV人片在WWW色猫咪| 久久久精品人妻一区亚美研究所 | 色噜噜狠狠色综合AV妖精| 国产精品成人无码视频| 亚洲国产精品久久一线不卡| 麻豆妓女爽爽一区二区三| 波多野结衣AⅤ无码一区| 欧美日韩视频在线第一区| 成人欧美一区二区三区性视频| 无码专区一VA亚洲V天堂| 国产成人久久精品二区三区小说 | 日韩AV片无码一区二区不卡电影| FREE性丰满HD性欧美| 四虎永久在线精品免费无码| 精品韩国AV无码一区二区三区| 亚洲国产AV玩弄放荡人妇| 麻豆精产国品一二三产区区| 厨房玩丰满人妻HD完整版视频| 亚洲AV中文无码乱人伦在线R▽| 撩起老师旗袍挺进去玉足| 成人久久免费网站| 亚洲AV无码一区二区三区鸳鸯影 | 红杏亚洲影院一区二区三区| 中文字幕久无码免费久久| 米奇777四色精品人人爽| 潮喷大喷水系列无码久久精品| 人人做人人爽国产视| 国产思思99RE99在线观看| 中文字幕一本性无码| 铜铜铜铜铜铜铜好大好深色板| 国产精成人品日日拍夜夜免费| 亚洲伊人成无码综合网| 日韩精品人妻无码久久影院| 精品久久免费一区二区三区四区|