一、在集合中文檔的某個鍵上面建立索引:
1、我們知道如果索引使用的得當,會大幅提升查詢速度,而如果使用不當有可能會使整個操作性能下降所以在建立索引的時候要考慮如下幾點:
(1)、會做什麼樣的查詢,哪些鍵需要建立索引
(2)、每個鍵的索引方向是怎麼樣的
(3)、如何應對擴展,怎麼排序鍵的方向,使更多常用的數據保存在內存中
2、這裏注意一下,建立索引的時候可以使用 1,-1 建立不同方向的索引
3、使用ensureIndex() 在指定的鍵上創建索引
4、建立普通索引:使用 ensureIndex()函數
例:db.mytest.ensureIndex({age:1})
//mytest集合中文檔的age鍵建立一個方向爲“1”的索引
5、內嵌文檔建立索引:
例:db.mytest.ensureIndex({comment.data:1})
//在mytest這個集合的comment這個鍵的data鍵上創建索引,內嵌索引和一般的索引是一樣的!
6、爲排序(Sort)做索引,如果沒有索引,或調用了沒有建立索引的鍵值進行排序,則mongodb會將所有數據加載到內從進行排序,這樣如果數量大,不能再內存中進行排序則會報錯,
7、索引的名稱默認按照:keyname1_dirx_keyname2_dirx的格式來顯示,其中的keyName1 就是默認的索引名稱,dirx就是建立的索引的方向
8、索引名的查看:indexs.find()
例:db.mytest.indexs.find();
// 查看在mytest集合下的所有的索引
9、建立索引時,自定義索引名稱:
例:db.mytest.ensureIndex({age:1},{name:'indexname'})
// 在mytest集合中文檔的age鍵創方向爲1的索引,索引名稱爲indexname
10、唯一索引:唯一索引可以保證集合中每一個文檔的指定鍵都有唯一值
例:db.mytest.ensureIndex({name:1},{unique:true})
// 在mytest集合中的文檔的name鍵創建唯一索引,那麼集合中文檔的name鍵的值不會有重複的!
11、消除重複值:當我們在一個集合中先創建了文檔,而其中有些文檔的值值重複的,這時我們建立唯一索引,選擇dropDups這個選項則會把第一索引到的文檔保存,之後的就會被刪除!
例:db.mytest.ensureIndex({name:1},{unique:true,dropDups:true})
//mytest集合下文檔的name鍵創建方向爲‘1’的唯一索引,如果文檔的name鍵的值有重複,則保留第一個檢索到的值,而之後的文檔就會被刪除
12、複合唯一索引:這個和結構化數據庫表的鍵很相似,如果這個表的鍵是一個屬性確定的則這個屬性的值不能相同,而如果這個鍵是由兩個或多個屬性組成,則只要這多個屬性的值組合起來你能唯一確定一行數據就可以,而單個屬性的值可以相同,這個和唯一索引,複合唯一索引的定義表達同樣的意思
例:db.mytest.ensureIndex({name:1,id:1},{unique:true})
// 在mytest這個集合下的文檔的name id 鍵創建複合唯一索引,mytest集合下的文檔的name或id可以重複,而兩值一起只能確定一個文檔,不能重複!
13、使用explain()工具查看具體信息:
例:db.mytest.find().explain()
// mytest集合中有8個文檔
// cursor:'basicCursor' 說明這個查詢沒有使用索引,這個正常因爲查詢沒有條件
// nscanned: 代表數據庫查找了多少個文檔
// n代表數據返回的文檔的數量
// millis:毫秒數代表查詢使用的時間
14、有查詢條件的看看索引
例:db.mytest.find({age:2}).explain()
// 第一行數據就發生了變化,使用了btree索引,索引名稱是age_1
//nscanned:查詢的文檔樹變爲一,因爲有索引,所以不會進行全表掃描,所以查找的文檔數變少
二、管理索引:
1、修改索引:我們知道建立索引會費時,浪費資源,在建立索引期間,所有的數據庫的請求都會被阻塞,爲了能夠正常請求數據庫我們可以將索引的建立在後臺進行執行。
2、使用{background:true} 選項可以將索引的建立在後臺執行,這樣就可以正常請求數據庫,但有個缺點就是,索引的建立相對會慢一些!
3、刪除索引: collection.dropIndex({xxx:1/-1})
例:db.mytest.dropIndex({age:1})
// 從mytest這個集合中的文檔的age這個鍵上創建的索引
4、刪除所有索引: dropIndexes()
例:db.mytest.dropIndexes()
// 刪除這個集合下的文檔的多個鍵上創建的所有索引,包括_id 上的索引,通過運行結果可以看到!
5、之前說到mongodb的索引的建立使用 1,-1 來表示方向的,而mongodb還能建立地理空間索引,地理空間索引的建立使用'2d'來表示而不再是 1,-1
6、建立2d索引:ensureIndex()建立地理空間索引的鍵是有要求的:鍵的值必須是一對值,或一個數據或一對鍵值對
例:db.mytest.insert({age:1,name:'name1',map:[2,2]})
db.mytest.insert({age:2,name:'name2',map:[2,3]})
….
db.mytest.insert({age:5,name:'name5',map:[5,6]})
添加多條數據
建立地理空間索引:
例:db.mytest.ensureIndex({"map":"2d"})
7、地理空間索引查詢:使用 $near
從中查找離[5,5]最近的兩個點:例:db.mytest.find({map:{"$near":[5,5]}}).limit(2)
8、按照圖形來查找:方形{"$within":{"#box":[[2,2],[6,6]]}}
例:db.mytest.find({"map":{"$within":{"$box":[[2,2],[6,6]]}}})
9、按照圖形查找:圓形{"$within":{"#center":[[3,3],1]}}
例:db.mytest.find({"map":{"$within":{"$center":[[3,3],1]}}})
//[[3,3],1]以3,3 作爲圓心,以1作爲半徑,查找離圓心由近到遠的點
注意:這裏只是總結了mongodb中索引相關的命令,而怎麼建立高性能的索引及索引相關知識點深入學習可以學習MYSQL的索引,因爲他們的索引的理念是一樣的!