一、索引說明:
索引是對數據庫表中一列或多列的值進行排序的一種結構,可以讓我們查詢數據庫變得 更快。MongoDB 的索引幾乎與傳統的關係型數據庫一模一樣,這其中也包括一些基本的查詢優化技巧。
創建索引的命令:
-- 阻塞其他操作
db.集合名稱.ensureIndex({字段:1});
-- 不阻塞其他操作,後臺操作
db.集合名稱.ensureIndex({"字段":1},{"background":true})
獲取當前集合的索引:
db.集合名稱.getIndexes()
刪除索引的命令是:
db.庫名稱.dropIndex({"字段":1});
在 MongoDB 中,我們同樣可以創建複合索引,如:
db.集合名稱.ensureIndex({"字段1":1,"字段2":-1}) //數字 1 表示 字段1鍵的索引按升序存儲,-1 表示 字段2鍵的索引按照降序方式存儲。
該索引被創建後,基於 字段1和 字段2的查詢將會用到該索引,或者是基於 字段1的查詢也會用到該索引,但是隻是基於 字段2的查詢將不會用到該複合索引。因此可以說, 如果想用到複合索引,必須在查詢條件中包含複合索引中的前 N 個索引列。如:db.集合名稱.find({"字段2":30})
然而如果查詢 條件中的鍵值順序和複合索引中的創建順序不一致的話,MongoDB 可以智能的幫助我們調 整該順序,以便使複合索引可以爲查詢所用。如:db.集合名稱.find({"字段2":30,"字段1":"card"})
對於上面示例中的查詢條件,MongoDB 在檢索之前將會動態的調整查詢條件文檔的順 序,以使該查詢可以用到剛剛創建的複合索引。
對於上面創建的索引,MongoDB 都會根據索引的 keyname 和索引方向爲新創建的索引 自動分配一個索引名,下面的命令可以在創建索引時爲其指定索引名,如:db.集合名稱.ensureIndex({"字段":1},{"字段":"card"})
隨着集合的增長,需要針對查詢中大量的排序做索引。如果沒有對索引的鍵調用 sort, MongoDB 需要將所有數據提取到內存並排序。因此在做無索引排序時,如果數據量過大以 致無法在內存中進行排序,此時 MongoDB 將會報錯。
二、唯一索引
在缺省情況下創建的索引均不是唯一索引。
案例:
db.集合名稱.ensureIndex({"字段id":1},{"unique":true}) 如果再次插入 字段id重複的文檔時,MongoDB 將報錯,以提示插入重複鍵,
創建複合唯一索引:
db.集合名稱.ensureIndex({"字段1":1,"字段2":1},{"unique":true});
三、索引參數說明:
四、索引分析(explain)
explain 是非常有用的工具,會幫助你獲得查詢方面諸多有用的信息。只要對遊標調用 該方法,就可以得到查詢細節。explain 會返回一個文檔,而不是遊標本身。如:
db.test.find().explain();
查詢具體的執行狀態:
db.tablename.find().explain( "executionStats" )
總結
- 索引對於快速高效地搜索集合中的文檔。
- 可以使用createIndex方法創建索引。可以僅在一個字段或多個字段值上創建索引。
- 可以使用getIndexes方法找到索引。
- 可以通過將dropIndex用於單個索引或將dropIndex用於刪除所有索引來刪除索引。
官方文檔:https://docs.mongodb.com/manual/sharding/
社區:https://mongoing.com/archives/docs/mongodb初學者教程/mongodb分片