日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解

發(fā)布時間:2023/12/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 mongoDB索引的管理

本節(jié)介紹mongoDB中的索引,熟悉mysql/sqlserver等關(guān)系型數(shù)據(jù)庫的小伙伴應(yīng)該都知道索引對優(yōu)化數(shù)據(jù)查詢的重要性。我們先簡單了解一下索引:索引的本質(zhì)就是一個排序的列表,在這個列表中存儲著索引的值和包含這個值的數(shù)據(jù)(數(shù)據(jù)row或者document)的物理地址,索引可以大大加快查詢的速度,這是因?yàn)槭褂盟饕罂梢圆辉賿呙枞韥矶ㄎ荒承械臄?shù)據(jù),而是先通過索引表找到該行數(shù)據(jù)對應(yīng)的物理地址(多數(shù)為B-tree查找),然后通過地址來訪問相應(yīng)的數(shù)據(jù)。

索引可以加快數(shù)據(jù)檢索、排序、分組的速度,減少磁盤I/O,但是索引也不是越多越好,因?yàn)樗饕旧硪彩菙?shù)據(jù)表,需要占用存儲空間,同時索引需要數(shù)據(jù)庫進(jìn)行維護(hù),當(dāng)我們對索引列的值進(jìn)行增改刪操作時,數(shù)據(jù)庫需要更新索引表,這會增加數(shù)據(jù)庫的壓力。

我們要根據(jù)實(shí)際情況來判斷哪些列適合添加索引,哪些列不適合添加索引,一般遵循的規(guī)律如下:

主/外鍵列,主鍵用于強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);外鍵可以加快連接的速度;

經(jīng)常用于比較的類(大于小于等于等),因?yàn)樗饕呀?jīng)排序,值就是大于/小于的分界點(diǎn);

經(jīng)常進(jìn)行范圍搜索,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;

經(jīng)常進(jìn)行排序的列,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時間;

經(jīng)常進(jìn)行分組的列,因?yàn)樗饕呀?jīng)排序,同一個值的所有數(shù)據(jù)地址會聚集在一塊,很方便分組。

我們看一下mongoDB的索引使用,首先準(zhǔn)備數(shù)據(jù):

db.userinfos.insertMany([

{_id:1, name: "張三", age: 23,level:10, ename: { firstname: "san", lastname: "zhang"}, roles: ["vip","gen"]},

{_id:2, name: "李四", age: 24,level:20, ename: { firstname: "si", lastname: "li"}, roles:[ "vip"]},

{_id:3, name: "王五", age: 25,level:30, ename: { firstname: "wu", lastname: "wang"}, roles: ["gen","vip"]},

{_id:4, name: "趙六", age: 26,level:40, ename: { firstname: "liu", lastname: "zhao"}, roles: ["gen"] },

{_id:5, name: "田七", age: 27, ename: { firstname: "qi", lastname: "tian"}, address:'北京'},

{_id:6, name: "周八", age: 28,roles:["gen"], address:'上海'}

]);

索引的增刪改查還是十分簡單的,我們看一下索引管理的幾個方法:

//創(chuàng)建索引,值1表示正序排序,-1表示倒序排序db.userinfos.createIndex({age:-1})//查看userinfos中的所有索引

db.userinfos.getIndexes()//刪除特定一個索引

db.userinfos.dropIndex({name:1,age:-1})//刪除所有的索引(主鍵索引_id不會被刪除)

db.userinfos.dropIndexes()//如果我們要修改一個索引的話,可以先刪除索引然后在重新添加。

2 mongoDB中常用的索引類型

1 單鍵索引

單鍵索引(Single Field Indexes)顧名思義就是單個字段作為索引列,mongoDB的所有collection默認(rèn)都有一個單鍵索引_id,我們也可以對一些經(jīng)常作為過濾條件的字段設(shè)置索引,如給age字段添加一個索引,語法十分簡單:

//給age字段添加升序索引

db.userinfos.createIndex({age:1})

其中{age:1}中的1表示升序,如果想設(shè)置倒序索引的話使用?db.userinfos.createIndex({age:-1})?即可。我們通過explain()方法查看查詢計劃,如下圖,看到查詢age=23的document時使用了索引,如果沒有使用索引的話stage=COLLSCAN。

因?yàn)閐ocument的存儲是bson格式的,我們也可以給內(nèi)置對象的字段添加索引,或者將整個內(nèi)置對象作為一個索引,語法如下:

//1.內(nèi)嵌對象的某一字段作為索引//在ename.firstname字段上添加索引

db.userinfos.createIndex({"ename.firstname":1})//使用ename.firstname字段的索引查詢

db.userinfos.find({"ename.firstname":"san"})//2.整個內(nèi)嵌對象作為索引//給整個ename字段添加索引

db.userinfos.dropIndexes()//使用ename字段的索引查詢

db.userinfos.createIndex({"ename":1})

2 復(fù)合索引

復(fù)合索引(Compound Indexes)指一個索引包含多個字段,用法和單鍵索引基本一致。使用復(fù)合索引時要注意字段的順序,如下添加一個name和age的復(fù)合索引,name正序,age倒序,document首先按照name正序排序,然后name相同的document按age進(jìn)行倒序排序。mongoDB中一個復(fù)合索引最多可以包含32個字段。

//添加復(fù)合索引,name正序,age倒序

db.userinfos.createIndex({"name":1,"age":-1})//過濾條件為name,或包含name的查詢會使用索引(索引的第一個字段)

db.userinfos.find({name:'張三'}).explain()

db.userinfos.find({name:"張三",level:10}).explain()

db.userinfos.find({name:"張三",age:23}).explain()//查詢條件為age時,不會使用上邊創(chuàng)建的索引,而是使用的全表掃描

db.userinfos.find({age:23}).explain()

執(zhí)行查詢時查詢計劃如下:

3 多鍵索引

多鍵索引(mutiKey Indexes)是建在數(shù)組上的索引,在mongoDB的document中,有些字段的值為數(shù)組,多鍵索引就是為了提高查詢這些數(shù)組的效率。看一個栗子:準(zhǔn)備測試數(shù)據(jù),classes集合中添加兩個班級,每個班級都有一個students數(shù)組,如下:

db.classes.insertMany([

{"classname":"class1","students":[{name:'jack',age:20},

{name:'tom',age:22},

{name:'lilei',age:25}]

},

{"classname":"class2","students":[{name:'lucy',age:20},

{name:'jim',age:23},

{name:'jarry',age:26}]

}]

)

為了提高查詢students的效率,我們使用?db.classes.createIndex({'students.age':1})?給students的age字段添加索引,然后使用索引,如下圖:

4 哈希索引

哈希索引(hashed Indexes)就是將field的值進(jìn)行hash計算后作為索引,其強(qiáng)大之處在于實(shí)現(xiàn)O(1)查找,當(dāng)然用哈希索引最主要的功能也就是實(shí)現(xiàn)定值查找,對于經(jīng)常需要排序或查詢范圍查詢的集合不要使用哈希索引。

3 mongoDB中常用的索引屬性

1? 唯一索引

唯一索引(unique indexes)用于為collection添加唯一約束,即強(qiáng)制要求collection中的索引字段沒有重復(fù)值。添加唯一索引的語法:

//在userinfos的name字段添加唯一索引

db.userinfos.createIndex({name:1},{unique:true})

看一個使用唯一索引的栗子:

2? 局部索引

局部索引(Partial Indexes)顧名思義,只對collection的一部分添加索引。創(chuàng)建索引的時候,根據(jù)過濾條件判斷是否對document添加索引,對于沒有添加索引的文檔查找時采用的全表掃描,對添加了索引的文檔查找時使用索引。使用方法也比較簡單:

//userinfos集合中age>25的部分添加age字段索引

db.userinfos.createIndex(

{age:1},

{ partialFilterExpression: {age:{$gt:25}}}

)//查詢age<25的document時,因?yàn)閍ge<25的部分沒有索引,會全表掃描查找(stage:COLLSCAN)

db.userinfos.find({age:23})//查詢age>25的document時,因?yàn)閍ge>25的部分創(chuàng)建了索引,會使用索引進(jìn)行查找(stage:IXSCAN)

db.userinfos.find({age:26})

當(dāng)查詢age=23的記錄時,stage=COLLSCAN,當(dāng)查詢age=26的記錄時,使用了索引,如下:

2 稀疏索引

稀疏索引(sparse indexes)在有索引字段的document上添加索引,如在address字段上添加稀疏索引時,只有document有address字段時才會添加索引。而普通索引則是為所有的document添加索引,使用普通索引時如果document沒有索引字段的話,設(shè)置索引字段的值為null。

稀疏索引的創(chuàng)建方式如下,當(dāng)document包含address字段時才會創(chuàng)建索引:

//創(chuàng)建在address上創(chuàng)建稀疏索引

db.userinfos.createIndex({address:1},{sparse:true})

看一個使用稀疏索引的栗子:

4 TTL索引

TTL索引(TTL indexes)是一種特殊的單鍵索引,用于設(shè)置document的過期時間,mongoDB會在document過期后將其刪除,TTL非常容易實(shí)現(xiàn)類似緩存過期策略的功能。我們看一個使用TTL索引的栗子:

//添加測試數(shù)據(jù)

db.logs.insertMany([

{_id:1,createtime:new Date(),msg:"log1"},

{_id:2,createtime:new Date(),msg:"log2"},

{_id:3,createtime:new Date(),msg:"log3"},

{_id:4,createtime:new Date(),msg:"log4"}

])//在createtime字段添加TTL索引,過期時間是120s

db.logs.createIndex({createtime:1}, { expireAfterSeconds: 120})//logs中的document在創(chuàng)建后的120s后過期,會被mongoDB自動刪除

注意:TTL索引只能設(shè)置在date類型字段(或者包含date類型的數(shù)組)上,過期時間為字段值+exprireAfterSeconds;document過期時不一定就會被立即刪除,因?yàn)閙ongoDB執(zhí)行刪除任務(wù)的時間間隔是60s;capped Collection不能設(shè)置TTL索引,因?yàn)閙ongoDB不能主動刪除capped Collection中的document。

小結(jié)

本節(jié)介紹了mongoDB中常用的索引和索引屬性,索引對提升數(shù)據(jù)檢索的速度十分重要,在數(shù)據(jù)量比較大的時候一般都要在collection上建立索引。mongoDB提供的索引種類很豐富,總會有幾種適用于我們的業(yè)務(wù),除了上邊介紹的索引外,mongoDB還支持text index和一些地理位置相關(guān)的索引,這里不再介紹,有興趣的小伙伴可以到官網(wǎng)?研究下。如果文中有錯誤的話,希望大家可以指出,我會及時修改,謝謝。

總結(jié)

以上是生活随笔為你收集整理的mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。