索引
MongoDB支持索引。如果沒有建立索引,MongoDB必須執行集合掃描,即掃描集合中的每個文檔,以選擇與查詢語句匹配的那些文檔。 如果查詢存在適當的索引,則MongoDB可以使用該索引來限制它必須檢查的文檔數。
建立索引通常能夠極大的提高查詢的效率,索引主要用於排序和檢索。索引是特殊的數據結構,它以易於遍歷的形式存儲收藏集數據集的一小部分。 索引存儲一個特定字段或一組字段的值,按該字段的值排序。 索引條目的排序支持有效的相等匹配和基於範圍的查詢操作。 另外,MongoDB可以通過使用索引中的順序來返回排序的結果。
怎麼創建索引
要在Mongo Shell中創建索引,使用db.collection.createIndex()。
<code>db.collection.createIndex(, <options> )/<options> /<code>
key and index type specification:索引的Key值和規範配置
Key值為要創建的索引字段,1為指定按升序創建索引,-1為降序,也可以指定為hashed(哈希索引)
options:索引屬性等相關的配置。
例如:
<code>db.collection.createIndex( { name: -1 } )/<code>
在本地測試庫創建一個索引
查看創建的索引
可以看出MongoDB默認在_id上創建一個索引(唯一索引), _id索引可防止客戶端為_id字段插入兩個具有相同值的文檔。name:-1,索引的名稱會按照這個規則生成,索引創建的key + 下劃線"_" + -1。
數值1還起到了排序的作用。值1指定一個索引,該索引按升序對項目進行排序。 值-1指定一個索引,該索引按降序對項目進行排序。
例如本例中的索引名稱為name_-1。你也可以自己設置索引的名稱。
一旦創建索引,將無法重命名。所以,必須刪除並使用新名稱重新創建索引。
索引的類型
單鍵索引
在某一個特定的屬性上建立索引,例如:db.users.createIndex({score:-1});
複合索引
在多個特定的屬性上建立索引,例如:db.users. createIndex({username:1,age:-1,country:1});
複合索引中列出的字段順序具有重要意義。例如,如果一個複合索引由{userid:1,score:-1}組成,則該索引首先按userid排序,然後在每個userid值內按score排序。
對於複合索引和排序操作,索引鍵的排序順序(即升序或降序)可以確定索引是否可以支持排序操作。
在索引字段上進行精確匹配、排序以及範圍查找都會使用此索引,但與索引的順序有關。
為了性能考慮,應刪除存在與第一個鍵相同的單鍵索引。
多鍵索引
MongoDB使用多鍵索引來索引存儲在數組中的內容。 如果您對保存數組值的字段建立索引,則MongoDB將為數組的每個元素創建單獨的索引條目。 這些多鍵索引允許查詢通過匹配數組的一個或多個元素來選擇包含數組的文檔。 如果索引字段包含數組值,MongoDB會自動確定是否創建多鍵索引。 您無需顯式指定多鍵類型。
哈希索引
不同於傳統的B-樹索引,哈希索引使用hash函數來創建索引。
例如:db.users.createIndex({username : 'hashed'});
在索引字段上進行精確匹配,但不支持範圍查詢,不支持多鍵hash。
Hash索引上的入口是均勻分佈的,在分片集合中非常有用。
從4.0版開始,mongo shell提供了convertShardKeyToHashed()方法。 此方法使用與散列索引相同的散列函數,並可用於查看鍵的散列值是什麼。
地理空間索引
為了支持對地理空間座標數據的高效查詢,MongoDB提供了兩個特殊的索引:返回結果時使用平面幾何的2d索引和使用球面幾何返回結果的2dsphere索引。
具體可參看:https://docs.mongodb.com/manual/core/2d/
文本索引
MongoDB提供了一種文本索引類型,該類型支持在集合中搜索字符串內容。 這些文本索引不存儲特定於語言的停用詞(例如"the", "a","or"),並且在集合中詞幹僅存儲根詞。
索引屬性
常見的索引屬性如下:
索引管理方法
創建索引
單鍵唯一索引:db.users. createIndex({username :1},{unique:true});
單鍵唯一稀疏索引:db.users. createIndex({username :1},{unique:true,sparse:true});
複合唯一稀疏索引:db.users. createIndex({username:1,age:-1},{unique:true,sparse:true});
創建哈希索引並後臺運行:db.users. createIndex({username :'hashed'},{background:true});
刪除索引
根據索引名字刪除某一個指定索引:db.users.dropIndex("username_1");
刪除某集合上所有索引:db.users.dropIndexs();
刪除重建某集合上所有索引:db.users.reIndex();
查詢集合上所有索引:db.users.getIndexes();
閱讀更多 代碼接盤俠 的文章