在任何的數(shù)據(jù)庫之中, 索引都是一種提升數(shù)據(jù)庫檢索性能的手段,這一點在MongoDB數(shù)據(jù)庫之中同樣是存在的, 在MongoDB數(shù)據(jù)庫里面依然會存在有2中的索引創(chuàng)建: 是自動創(chuàng)建的, 另外一種索引是手工創(chuàng)建的法牲。
范例: 重新準備一個新的簡單集合
db.students.drop()
db.students.insert({"name": "張三", "sex":"男","age": 19, "score": 89, "address": "海淀區(qū)"})
db.students.insert({"name": "李四", "sex":"女","age": 20, "score": 59, "address": "朝陽區(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": "朝陽區(qū)"})
db.students.insert({"name": "錢十", "sex":"女","age": 21, "score": 56, "address": "西城區(qū)"})
此時在students集合上并沒有去設置任何的索引, 那么下面通過getIndexes()函數(shù)來觀察在students集合里面已經(jīng)存在的索引內(nèi)容
db.collections.getIndexes()
現(xiàn)在發(fā)現(xiàn)會存在有一個"_id"列的索引內(nèi)容叭喜。但是如果要想創(chuàng)建自己的索引, 則可以使用如下的語法:
索引創(chuàng)建: db.collections.ensureIndex({列: 1})
|- 設置的1表示索引將按照升序的方式進行排列, 如果使用降序設置為"-1"
范例: 創(chuàng)建一個索引, 在age字段上設置一個降序索引;
db.students.ensureIndex({"age": -1})
此時并沒有設置索引的名字, 所以名字是自命名的. 命名規(guī)范: "字段名稱_索引的排序模式"。
范例: 針對于當前的age字段上的索引做一個分析.
db.students.find({"age": 19}).explain()
此時的查詢使用了索引的技術(shù), 但是下面再來觀察一個查詢, 不適用索引字段壁拉。
范例: 針對于score字段上的設置查詢
db.students.find({"score": {"$gt": 60}}).explain()
此時在score字段上并沒有設置索引, 所以當前的索引形式就變成了全集掃描的模式.
但是如果說, 現(xiàn)在換一種形式, 年齡和成績一起執(zhí)行判斷查詢?
db.students.find({"$or": [
{"age": {"$gt": 19}},
{"score": {"$gt": 60}}
]}).explain()
這是時候雖然age字段上存在有索引, 但是一個明顯的問題, 由于score字段上沒有索引, 所以依然使用的是全表掃描功能, 那么為了解決此事的問題,可以使用一個符合索引.
db.students.ensureIndex({"age": -1,"score": -1}, {name: "age_-1_score_-1_index"})
范例: 默認使用索引
db.students.find({"age": 19, "score": 89}).explain()
但是如果換到了條件之中
db.students.find({
{"age": {"$gt": 19}},
{"score': {"$gt": 60}}
}).explain()
現(xiàn)在發(fā)現(xiàn)并沒有使用索引, 所以這個時候看能否強制使用一次索引戳稽。hint()函數(shù)為強制使用索引操作
范例: 強制使用索引
db.students.find({"$or": [
{"age": {"$gt": 19}},
{"score": {"$gt": 60}}
]}).hint({"age": -1, "score": -1}).explain()
如果正常來講, 這個代碼根本就不可能調(diào)用默認的索引執(zhí)行, 但是我們覺得不好, 所以需要使用hint()函數(shù)來強制MongoDB告訴你必須使用一次索引, 由于此時在age和score兩個字段上已經(jīng)設置了復合索引,那么現(xiàn)在使用的就是默認的復合索引.
但是如果在一個集合里面設置了太多的索引, 實際上會導致性能下降, 那么就可以刪除索引.
范例: 刪除一個索引
db.students.dropIndex({"age": -1, "score": -1})
可是如果只是一個一個刪除索引也會很麻煩, 所以提供有刪除全部索引的操作.
范例: 刪除全部索引
db.students.dropIndexes()
所謂的刪除全部索引指的就是非"_id"的索引,所有的自定義索引.
5.1