mongodb索引講解與優(yōu)化

語(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查看

新版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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丙者,一起剝皮案震驚了整個(gè)濱河市复斥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌械媒,老刑警劉巖目锭,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件评汰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痢虹,警方通過查閱死者的電腦和手機(jī)被去,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奖唯,“玉大人惨缆,你說我怎么就攤上這事》峤荩” “怎么了坯墨?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)病往。 經(jīng)常有香客問我捣染,道長(zhǎng),這世上最難降的妖魔是什么停巷? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任耍攘,我火速辦了婚禮,結(jié)果婚禮上畔勤,老公的妹妹穿的比我還像新娘少漆。我一直安慰自己,他們只是感情好硼被,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布示损。 她就那樣靜靜地躺著,像睡著了一般嚷硫。 火紅的嫁衣襯著肌膚如雪检访。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天仔掸,我揣著相機(jī)與錄音脆贵,去河邊找鬼。 笑死起暮,一個(gè)胖子當(dāng)著我的面吹牛卖氨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播负懦,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼筒捺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了纸厉?” 一聲冷哼從身側(cè)響起系吭,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颗品,沒想到半個(gè)月后肯尺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沃缘,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年则吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槐臀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氓仲,死狀恐怖水慨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寨昙,我是刑警寧澤讥巡,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站舔哪,受9級(jí)特大地震影響欢顷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捉蚤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一抬驴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缆巧,春花似錦布持、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捉超,卻和暖如春胧卤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拼岳。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工枝誊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惜纸。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓叶撒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耐版。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祠够,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容