5. 索引操作

在任何的數(shù)據(jù)庫(kù)之中, 索引都是一種提升數(shù)據(jù)庫(kù)檢索性能的手段,這一點(diǎn)在MongoDB數(shù)據(jù)庫(kù)之中同樣是存在的, 在MongoDB數(shù)據(jù)庫(kù)里面依然會(huì)存在有2中的索引創(chuàng)建: 是自動(dòng)創(chuàng)建的, 另外一種索引是手工創(chuàng)建的。

范例: 重新準(zhǔn)備一個(gè)新的簡(jiǎn)單集合

db.students.drop()
db.students.insert({"name": "張三", "sex":"男","age": 19, "score": 89, "address": "海淀區(qū)"})
db.students.insert({"name": "李四", "sex":"女","age": 20, "score": 59, "address": "朝陽(yáng)區(qū)"})
db.students.insert({"name": "王五", "sex":"女","age": 19, "score": 99, "address": "西城區(qū)"})
db.students.insert({"name": "趙六", "sex":"男","age": 20, "score": 100, "address": "東城區(qū)"})
db.students.insert({"name": "孫七", "sex":"男","age": 19, "score": 20, "address": "海淀區(qū)"})
db.students.insert({"name": "王八", "sex":"女","age": 21, "score": 0, "address": "海淀區(qū)"})
db.students.insert({"name": "劉九", "sex":"男","age": 19, "score": 70, "address": "朝陽(yáng)區(qū)"})
db.students.insert({"name": "錢(qián)十", "sex":"女","age": 21, "score": 56, "address": "西城區(qū)"})

此時(shí)在students集合上并沒(méi)有去設(shè)置任何的索引, 那么下面通過(guò)getIndexes()函數(shù)來(lái)觀察在students集合里面已經(jīng)存在的索引內(nèi)容

db.collections.getIndexes()

現(xiàn)在發(fā)現(xiàn)會(huì)存在有一個(gè)"_id"列的索引內(nèi)容。但是如果要想創(chuàng)建自己的索引, 則可以使用如下的語(yǔ)法:
索引創(chuàng)建: db.collections.ensureIndex({列: 1})
|- 設(shè)置的1表示索引將按照升序的方式進(jìn)行排列, 如果使用降序設(shè)置為"-1"

范例: 創(chuàng)建一個(gè)索引, 在age字段上設(shè)置一個(gè)降序索引;

db.students.ensureIndex({"age": -1})

此時(shí)并沒(méi)有設(shè)置索引的名字, 所以名字是自命名的. 命名規(guī)范: "字段名稱_索引的排序模式"。

范例: 針對(duì)于當(dāng)前的age字段上的索引做一個(gè)分析.

db.students.find({"age": 19}).explain()

此時(shí)的查詢使用了索引的技術(shù), 但是下面再來(lái)觀察一個(gè)查詢, 不適用索引字段。

范例: 針對(duì)于score字段上的設(shè)置查詢

db.students.find({"score": {"$gt": 60}}).explain()

此時(shí)在score字段上并沒(méi)有設(shè)置索引, 所以當(dāng)前的索引形式就變成了全集掃描的模式.
但是如果說(shuō), 現(xiàn)在換一種形式, 年齡和成績(jī)一起執(zhí)行判斷查詢?

db.students.find({"$or": [
  {"age": {"$gt": 19}},
  {"score": {"$gt": 60}}
]}).explain()

這是時(shí)候雖然age字段上存在有索引, 但是一個(gè)明顯的問(wèn)題, 由于score字段上沒(méi)有索引, 所以依然使用的是全表掃描功能, 那么為了解決此事的問(wèn)題,可以使用一個(gè)符合索引.

db.students.ensureIndex({"age": -1,"score": -1}, {name: "age_-1_score_-1_index"})

范例: 默認(rèn)使用索引

db.students.find({"age": 19, "score": 89}).explain()

但是如果換到了條件之中

 db.students.find({
   {"age": {"$gt": 19}},
   {"score': {"$gt": 60}}
 }).explain()

現(xiàn)在發(fā)現(xiàn)并沒(méi)有使用索引, 所以這個(gè)時(shí)候看能否強(qiáng)制使用一次索引。hint()函數(shù)為強(qiáng)制使用索引操作

范例: 強(qiáng)制使用索引

db.students.find({"$or": [
{"age": {"$gt": 19}},
{"score": {"$gt": 60}}
]}).hint({"age": -1, "score": -1}).explain()

如果正常來(lái)講, 這個(gè)代碼根本就不可能調(diào)用默認(rèn)的索引執(zhí)行, 但是我們覺(jué)得不好, 所以需要使用hint()函數(shù)來(lái)強(qiáng)制MongoDB告訴你必須使用一次索引, 由于此時(shí)在age和score兩個(gè)字段上已經(jīng)設(shè)置了復(fù)合索引,那么現(xiàn)在使用的就是默認(rèn)的復(fù)合索引.

但是如果在一個(gè)集合里面設(shè)置了太多的索引, 實(shí)際上會(huì)導(dǎo)致性能下降, 那么就可以刪除索引.

范例: 刪除一個(gè)索引

db.students.dropIndex({"age": -1, "score": -1})

可是如果只是一個(gè)一個(gè)刪除索引也會(huì)很麻煩, 所以提供有刪除全部索引的操作.

范例: 刪除全部索引

db.students.dropIndexes()

所謂的刪除全部索引指的就是非"_id"的索引,所有的自定義索引.

5.1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容