一、索引操作
索引是為了最佳化查詢速度而生,MongoDB的索引和其他關係型資料庫,比如MySQL,Oracle等的索引幾乎相同,對於它們的索引最佳化經驗同樣適用於MongoDB。
1、建立索引
MongoDB中建立索引是通過ensureIndex操作完成的。下面測試了在使用索引和不使用索引下的效能差別,使用explain函數進行查詢效能分析。
插入測試資料:
不使用索引的查詢:
使用索引的查詢:
由以上測試可見,使用恰當的索引尋找可以大大最佳化查詢效率。
2、刪除索引
索引的元資訊儲存在每個資料庫的system.indexes集合中,該集合為保留集合,不能對其插入或刪除文檔。
操作只能通過ensureIndex或dropIndexes進行。
二、唯一索引
唯一索引可以確保集合的每一個文檔的指定鍵都有唯一值。MongoDB建立唯一索引的方式如下:
db.person.ensureIndex({"name":1},{"unique":true})
如果沒有對應的鍵,索引會將其作為null儲存。所以,如果對某個鍵建立了唯一索引,但插入了多個缺少該索引鍵的文檔,則由於文檔包含null值而導致插入失敗。
三、複合式索引
通過為ensureIndex的第一個參數傳入多個索引值的文檔來實現複合式索引的建立。複合式索引適用於對多條件查詢的最佳化上,一般來說,如果索引包含N個鍵,則對於前幾個鍵的查詢都會有協助。比如有個索引{"a":1,"b":1,"c":1,...,"z":1},實際上是有了{"a":1},{"a":1,"b":1},{"a":1,"b":1,"c":1}等的索引,但使用{"b":1},{"a":1,"c":1}等索引的查詢則不會被最佳化。
四、地理空間索引
MongoDB的地理空間索引用於處理平面座標的查詢,對於尋找離當前位置最近的N個場所非常適用,在LBS應用中經常使用。
1、建立空間索引
db.map.ensureIndex({"gps":"2d"})
"gps"鍵的值 必須是某種形式的一對值:一個包含兩個元素的數組或是包含兩個鍵(鍵名隨意)的內嵌文檔,如下所示:
{"gps":[0,100]}{"gps":{"x":0,"y":30}}{"gps":{"latitude":0,"longitude":100}}
預設情況下,地理空間索引假設值的範圍是 -180~180,這對於處理經緯度非常方便,也可以設定其範圍:
db.map.ensureIndex({"gps":"2d"},{"min":-360,"max":360})
2、尋找
通過find函數尋找:
將按照離座標點(40,80)由近及遠的方式將map集合的前5個文檔返回。
db.map.find({"gps":{"$near":[40,80]}}).limit(5)
通過資料庫命令尋找:
db.runCommand({geoNear:"map",near:[40,80],num:5});
geoNear和使用$near的find普通尋找類似,不過geoNear還會返回每個文檔到查詢點的距離。該距離以插入資料為單位,比如按照經緯度的角度插入,那距離就是經緯度。
具體其他空間索引的尋找請參考MongoDB官方文檔關於索引的介紹。
五、總結
對於索引的使用,要建立合適的索引,可以使用explain查看當前索引的效果。如果索引不適合當前業務需求的話,就要修改或刪除,以免不必要或不恰當的索引對資料庫操作產生影響。畢竟索引需要消耗記憶體和檔案儲存體。對於索引要即時維護,不要索引每一個鍵。