MongoDb-大數據查詢優化

一、索引說明:
        索引是對數據庫表中一列或多列的值進行排序的一種結構,可以讓我們查詢數據庫變得 更快。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分片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章