您好,登錄后才能下訂單哦!
1.索引的相關(guān)介紹:
monggodb的索引也是一顆平衡二叉樹(shù),所以在傳統(tǒng)數(shù)據(jù)庫(kù)中的絕大部分的索引優(yōu)化技術(shù)也是可用的.
注意:mongodb可以在任意方向上對(duì)數(shù)據(jù)進(jìn)行遍歷(這點(diǎn)和關(guān)系數(shù)據(jù)庫(kù)中的索引不一樣),但這個(gè)僅限于單鍵排序,對(duì)于多鍵排序索引的方向還是比較重要的.
下面是個(gè)單鍵排序無(wú)方向性的具體的例子:
上面是兩個(gè)查詢(xún)的執(zhí)行計(jì)劃,紅色部分的參數(shù)表示,查詢(xún)是否在內(nèi)存中有排序操作,
從上面的例子中可以很明顯的看出,無(wú)論是按照iage的降序還是升序排序,查詢(xún)都沒(méi)有在內(nèi)存中有排序操作.
2.mongodb 中的索引類(lèi)型比較多,我這里僅僅列出比較常見(jiàn)的索引類(lèi)型,更多的索引類(lèi)型,參見(jiàn)http://www.cnblogs.com/xinghebuluo/archive/2011/12/19/2293043.html
唯一索引:它保證跟已有文檔的索引關(guān)鍵字重復(fù)的文檔不會(huì)被插入
上面的的例子中已成功創(chuàng)建一個(gè)唯一索引.
復(fù)合唯一索引:多個(gè)鍵值組合的唯一索引。
復(fù)合唯一索引實(shí)例:
創(chuàng)建唯一索引的注意事項(xiàng):
(1)唯一索引和不存在的關(guān)鍵字:
當(dāng)保存到集合中的文檔在索引字段沒(méi)有值的話(huà),它的索引字段會(huì)被賦值為null然后插入。就是說(shuō),你不可能在唯一索引中插入多個(gè)在某個(gè)索引字段都沒(méi)有值的文檔。(多個(gè)null值被認(rèn)為是相等的值)
以下實(shí)例在唯一索引字段上插入多個(gè)null值報(bào)錯(cuò).
(2).對(duì)已經(jīng)存在的重復(fù)值的字段創(chuàng)建唯一索引.
如果直接創(chuàng)建唯一索引肯定是會(huì)報(bào)錯(cuò)的.
(3).如果一定要在這樣的字段上創(chuàng)建唯一索引,可以在創(chuàng)建唯一索引的時(shí)候指定一個(gè)關(guān)鍵字dropDups來(lái)強(qiáng)制創(chuàng)建索引.但是這種創(chuàng)建索引的方法會(huì)刪除集合中的數(shù)據(jù),所以不建議使用這種方法。
使用dropDups強(qiáng)制創(chuàng)建索引范例:
稀疏索引:在mongdo的集合中,每個(gè)文檔的鍵值對(duì)可以不一樣(行的列數(shù)不一樣),那么在一個(gè)索引中,字段可能在某個(gè)文檔中,也有可能不在某個(gè)文檔中,當(dāng)字段不在某個(gè)文檔中的時(shí)候,查詢(xún)利用索引得到數(shù)據(jù)時(shí)默認(rèn)情況下會(huì)將沒(méi)有這個(gè)字段的文檔查詢(xún)出來(lái).
以上實(shí)例中的查詢(xún),通過(guò)索引iage 得到了數(shù)據(jù),但是將不包含iage字段的文檔也查詢(xún)出來(lái)了,
這個(gè)時(shí)候可以通過(guò)稀疏索引將那些沒(méi)有包含索引字段的文檔過(guò)濾掉.
以下是一個(gè)通過(guò)稀疏索引過(guò)濾不包含索引字段的的文檔的例子:
從執(zhí)行計(jì)劃中可以看到,查詢(xún)是通過(guò)稀疏索引得到數(shù)據(jù)的,并且查詢(xún)出來(lái)的結(jié)果集中全部包含iage字段(過(guò)濾掉了沒(méi)有包含iage的文檔).
3.索引管理:
查看制定集合下的索引信息 :db.collection.getIndexes();
查看當(dāng)前架構(gòu)下的所有索引信息 :db.system.indexes.find({});
創(chuàng)建索引:db.collection.ensureIndex({key:1}},{unique:true,dropDups:true});
hint({}):強(qiáng)制使用某個(gè)鍵值(索引)
還可以在后臺(tái)建立索引db.collection.ensureindex({someFiled:1},{background:1})
優(yōu)點(diǎn):定期釋放鎖,以便客服端寫(xiě)入數(shù)據(jù).
缺點(diǎn):耗時(shí)較長(zhǎng)
前臺(tái)建立索引(默認(rèn)):
優(yōu)點(diǎn):耗時(shí)相對(duì)較少
缺點(diǎn):索引創(chuàng)建期間客服端不能寫(xiě)入數(shù)據(jù)
刪除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
重建索引:db.test.reIndex()
標(biāo)識(shí)索引: db.collection.ensureIndex({key:1}},{name:"Index_name"});
(1):查看指定集合的所有索引:db.colleciton.getIndexes();
(2)查看當(dāng)前架構(gòu)下的所有索引信息 :db.system.indexes.find({});
(3)創(chuàng)建索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})
上面是創(chuàng)建索引的標(biāo)準(zhǔn)語(yǔ)法,第二個(gè)大括號(hào)({unique:true,dropDups:true,sparse:true})為索引類(lèi)型參數(shù)。
Unique:表示唯一索引。
Sparse:表示稀疏索引.
dropDups:當(dāng)索引字段中存在重復(fù)值時(shí),強(qiáng)制刪除重復(fù)的文檔,該參數(shù)會(huì)丟失數(shù)據(jù),不建議使用該參數(shù).
(4)hint({}):強(qiáng)制使用某個(gè)鍵值(索引)
下面實(shí)例中,從執(zhí)行計(jì)劃可以看出,強(qiáng)制使用索引了。
(5).刪除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
db.collection.dropIndexes():刪除集合下面的所有索引.
集合test下面已經(jīng)沒(méi)有可刪除的索引,_id_ 是系統(tǒng)自帶的索引,無(wú)法手動(dòng)刪除.
db.collection.dropIndex(index_name):刪除指定索引
(6).當(dāng)索引效率低下的時(shí)候(可能是碎片較多),就需要重建索引了。db.test.reIndex() 。
db.test.reIndex():重建索引
重建單個(gè)索引或是 集合下的所有索引。
4.執(zhí)行計(jì)劃解讀:
正確解讀一個(gè)查詢(xún)的執(zhí)行計(jì)劃是優(yōu)化查詢(xún)的第一步,所以必須準(zhǔn)確的讀懂查詢(xún)的執(zhí)行計(jì)劃:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。