真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MongoDB的索引

1、簡(jiǎn)介

創(chuàng)新互聯(lián)于2013年成立,先為盈江等服務(wù)建站,盈江等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為盈江企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

它就像是一本書的目錄,如果沒(méi)有它,我們就需要對(duì)整個(gè)書籍進(jìn)行查找來(lái)獲取需要的結(jié)果,即所說(shuō)的全盤掃描;

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

2、演示

第一步,向用戶集合users中插入100W條數(shù)據(jù)

MongoDB的索引

 1 var insertUsers = function() { 2     var start = new Date().getTime(); 3     for (var i = 1; i <= 1000000; i++) { 4         db.users.insert({ 5             "userid": i, 6             "username": "wjg" + i, 7             "age": Math.floor(Math.random() * 100), //年齡為0~99的隨機(jī)整數(shù) 8             "createdate": new Date() 9         })10     }11     var end = new Date().getTime();12     print("插入100W條數(shù)據(jù)共耗時(shí)" + (end - start) / 1000 + "秒");13 }

MongoDB的索引

LZ的渣渣I3和4G內(nèi)存總共耗時(shí)了484.623秒,約8分多鐘。任務(wù)管理器里邊可以很清楚的看到當(dāng)時(shí)CPU、內(nèi)存和磁盤使用率都普遍的增高。MongoDB的索引

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

MongoDB的索引 View Code

說(shuō)明:這里的explain方法相當(dāng)于查詢計(jì)劃,它會(huì)返回給你查詢過(guò)程的詳細(xì)信息。它的參數(shù)有三種模式:“queryPlanner”(查詢計(jì)劃[默認(rèn)])、“executionStats”(執(zhí)行狀態(tài))和“allPlansExecution”(所有執(zhí)行計(jì)劃),這里我們只關(guān)注它返回給我們的以下幾個(gè)信息。

1 "executionTimeMillis" : 865  //執(zhí)行的毫秒數(shù) 注:如果你是第一次執(zhí)行,可能會(huì)花費(fèi)更長(zhǎng)的時(shí)間2 3 "totalDocsExamined" : 1000000  //共檢查的文檔數(shù)

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

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

 重新執(zhí)行上次的查詢操作

MongoDB的索引 View Code

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

1 "executionTimeMillis" : 53  //執(zhí)行的毫秒數(shù)2 3 "totalDocsExamined" : 1  //共檢查的文檔數(shù)

加過(guò)索引之后查詢這個(gè)文檔所耗費(fèi)的時(shí)間僅僅為53毫秒,并且掃描一次直接定位,性能提升了16倍??梢姾侠硎褂盟饕闹匾?!

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

3、索引的類型

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

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

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

b)、復(fù)合索引:以多個(gè)屬性鍵為基礎(chǔ)而建立得索引

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

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

c)、多鍵索引:為數(shù)組中的多個(gè)值建立索引以實(shí)現(xiàn)高效查詢。

注:Ⅰ、不允許在多個(gè)數(shù)組上建立復(fù)合索引

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

Ⅲ、哈希索引不能是多鍵

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

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

e)、文本索引:用來(lái)支持查詢包含了字符串或者字符串?dāng)?shù)組的文檔

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

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

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

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

4、索引特性

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

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

說(shuō)明:在“createdate”字段上建立一個(gè)TTL索引,當(dāng)這個(gè)自段存在并且是日期類型,當(dāng)

c)、移除所有索引

1 db.users.dropIndexes()

d)、重建索引

1 db.users.reIndex()

說(shuō)明:該操作會(huì)先刪除所有索引,包括“_id”,然后重新創(chuàng)建所有索引

服務(wù)、思考、安全


名稱欄目:MongoDB的索引
文章來(lái)源:
http://weahome.cn/article/jhdcog.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部