語(yǔ)句集合
語(yǔ)句 | 功能 | 備注 |
---|---|---|
db.name. getIndexes() | 查詢索引 | |
db.name.totalIndexSize() | 查詢索引大小 | |
db.name.dropIndex("indexName") | 刪除索引 | |
db.name.dropIndex(‘*’) | 刪除name集合中的所有索引 | _id索引不會(huì)刪除 |
沒有修改索引的方法 | 如果想想修改索引 | 先刪除舊索引,再重新創(chuàng)建索引 |
db.name.ensureIndex() | 創(chuàng)建索引 |
索引種類
種類 | 解釋 | 備注 |
---|---|---|
默認(rèn)索引 | Mongodb每個(gè)collection都會(huì)有一個(gè)默認(rèn)主鍵_id厚满,這個(gè)不能刪除忌穿、也不會(huì)更名陆淀。當(dāng)collection創(chuàng)建后,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)”id”的索引乏盐,這個(gè)也是無(wú)法刪除與更名的 | |
單列索引 | 在單個(gè)欄位上創(chuàng)建的索引 | eg:需要對(duì)Mail的read創(chuàng)建升序索引:db.Mail.ensureIndex({‘read’:1}) |
組合索引 | 對(duì)多個(gè)鍵創(chuàng)建的索引 | eg:需要對(duì)Mail的user與folderId創(chuàng)建降序索引:db.Mail.ensureIndex({‘user’:-1,’folderId’:-1}) |
子文檔索引 | 可以為內(nèi)嵌文檔的鍵創(chuàng)建索引,這種與普通索引沒有什么區(qū)別 | eg:需要對(duì)Mail中的attachments下的filename創(chuàng)建索引: db.Mail.ensureIndex({‘a(chǎn)ttachments.filename’:1}) 注意:attachments.filename必須位于’’之中,否則會(huì)報(bào)錯(cuò) |
唯一索引 | 唯 一索引可能確保collection的每一個(gè)document指定的鍵的唯一性橘霎。當(dāng)文檔不存在指定鍵時(shí)虑凛,會(huì)被認(rèn)為鍵值是“null”碑宴,所以“null”也 會(huì)被認(rèn)為是重復(fù)的,所以一般被作為唯一索引的鍵桑谍,最好都要有鍵值對(duì) | 要保證Mail中每個(gè)用戶的mailfilename的唯一性:db.Mail.ensureIndex({‘user’:1,‘filename’:1},{name:’index1’,‘unique’:true}) 當(dāng)為已有的collection增加唯一索引時(shí)墓懂,可能會(huì)有數(shù)據(jù)已經(jīng)重復(fù)了。有時(shí)候可能希望將所有包含重復(fù)的文檔都刪除霉囚,可能在創(chuàng)建唯一索引時(shí)捕仔,使用dropDups選項(xiàng): db.Mail.ensureIndex({‘user’:1,‘filename’:1},{‘unique’:true,’dropDups’:true}) 這個(gè)會(huì)將重復(fù)的數(shù)據(jù)只保留一份盈罐,不過有點(diǎn)魯莽榜跌,如果數(shù)據(jù)很重要的話,建議不好這樣做盅粪。 注意了: Insert并不檢查文檔是否插入過钓葫,所以確保數(shù)據(jù)的唯一性,可能要用安全模式插入才行票顾。這樣础浮,在插入時(shí),如果有重復(fù)就會(huì)有錯(cuò)誤提醒 |
Sparse索引 | Sparse index解決索引文件過大的問題奠骄,有時(shí)候我們要索引的某個(gè)屬性并非是所有記錄都有豆同,普通的索引是將所有的記錄都包含進(jìn)來(lái),而sparse索引則僅包含含 有這個(gè)屬性的記錄含鳞,它不會(huì)對(duì)該項(xiàng)值為空的行作索引影锈。這樣就大大減小了某些列的索引大小。目前的限制是蝉绷,sparse index只能包含一個(gè)屬性鸭廷。 | eg:在Mail中有個(gè)標(biāo)簽屬性labels,這個(gè)屬性是唯一的熔吗,且有值的情況也不多辆床,這種情況就最適合用sparse索引 了,創(chuàng)建索引的命令為: db.Mail.ensureIndex({labels:1},{sparse:true}) |
Covered 索引 | 如果你查找的值正好是在索引中桅狠,則可以直接返回索引中存的值讼载,而不用到數(shù)據(jù)文件中查找宵晚。(這個(gè)在傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中也有實(shí)現(xiàn)),不過维雇,必須滿足以下條件: 1:必須提供準(zhǔn)備的返回字段淤刃,以便可以直接從索引庫(kù)中查詢 2:必須明確地排除使用_id字段{_id:0}當(dāng)用explain時(shí),當(dāng)indexOnly=true吱型,表示有用到covered index |
// do a login with a covered index, returning the users roles/groups > db.users.ensureIndex( { username : 1, password : 1, roles : 1} ); > db.users.save({username: "joe", password: "pass", roles: 2}) > db.users.save({username: "liz", password: "pass2", roles: 4}) > db.users.find({username: "joe"}, {_id: 0, roles: 1}) { "roles" : 2 } > db.users.find({username: "joe"}, {_id: 0, roles: 1}).explain() { "cursor" : "BtreeCursor username_1_password_1_roles_1", ... "indexOnly" : true, ... } |
索引觸發(fā)條件
索引命中:
假設(shè)索引為:
{a:1,b:1,c:1,d:1}:
實(shí)際上是有了下列索引
{a:1},{a:1,b:1},{a:1,b:1,c:1},{a:1,b:1,c:1,d:1}
但是使用{b:1}逸贾、{a:1,c:1}等索引的查詢是會(huì)被優(yōu)化的,只有使用索引前部的查詢才能使用該索引津滞。
Mongodb的查詢優(yōu)化器會(huì)重排查詢項(xiàng)的順序铝侵,以便命中索引,比如:查詢{x:’a’,y:’b’}的時(shí)候触徐,如果已有了{(lán)y:1,x:1}的索引咪鲜,mongodb也會(huì)自己找到并命中的。
創(chuàng)建索引的缺點(diǎn)是每次插入撞鹉、更新與刪除時(shí)都會(huì)產(chǎn)生額外的開銷疟丙,這是因?yàn)閿?shù)據(jù)庫(kù)不但需要執(zhí)行這些操作,還是處理索引鸟雏,因些享郊,要盡量可能少創(chuàng)建索引。每個(gè)集合默認(rèn)的最大索引個(gè)數(shù)為64個(gè)孝鹊。
查詢時(shí)炊琉,不要使用$ne or $nin,這樣不能命中索引
使用explain查看
db.collection.find(query).explain();
返回的信息如下
{“cursor” : “BasicCursor”,
“indexBounds” : [ ],
“nscanned” : 57594,
“nscannedObjects” : 57594,
“nYields” : 2 ,
“n” : 3 ,
“millis” : 108,
“indexOnly” : false}
現(xiàn)實(shí)結(jié)果可以得知cursor的類型又活,DB掃描的數(shù)據(jù)數(shù)苔咪,返回的數(shù)據(jù)數(shù),還有執(zhí)行的毫秒數(shù)柳骄。
“cursor” : “BasicCursor”:
命中的索引团赏,當(dāng)為BasicCursor時(shí)表示沒有命中任何索引
indexBounds: 所使用的索引,被設(shè)置為表示為索引掃描的關(guān)鍵邊界夹界。
nscanned – 掃描的數(shù)據(jù)條數(shù)馆里。
nscannedObjects – 掃描對(duì)象的數(shù)。
nYields – 查詢所產(chǎn)生的鎖的個(gè)數(shù)可柿。
isMultiKey- MongoDB中提供了可以自動(dòng)索引數(shù)組對(duì)象的值
If true, a multikey index was used.
n- 返回文檔的數(shù)量
millis- 數(shù)據(jù)庫(kù)中執(zhí)行查詢的時(shí)間
indexOnly – 是否使用了covered index。