MongoDB 索引和explain的使用

來源:互聯網
上載者:User
索引基礎

索引是對資料庫表中一列或多列的值進行排序的一種結構,可以讓我們查詢資料庫變得 更快。MongoDB 的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的查 詢最佳化技巧。 建索引的命令

db.user.ensureIndex({"username":1})  
擷取當前集合的索引
db.user.getIndexes() 
刪除索引的命令
db.user.dropIndex({"username":1})  

在 MongoDB 中,我們同樣可以建立複合索引,如:
數字 1 表示 username 鍵的索引按升序儲存,-1 表示 age 鍵的索引按照降序方式儲存。

db.user.ensureIndex({"username":1, "age":-1})  

該索引被建立後,基於 username 和 age 的查詢將會用到該索引,或者是基於 username 的查詢也會用到該索引,但是只是基於 age 的查詢將不會用到該複合索引。因此可以說, 如果想用到複合索引,必須在查詢條件中包含複合索引中的前 N 個索引列。然而如果查詢 條件中的索引值順序和複合索引中的建立順序不一致的話,MongoDB 可以智能的協助我們調 整該順序,以便使複合索引可以為查詢所用。如:

db.user.find({"age": 30, "username": "stephen"}) 

對於上面樣本中的查詢條件,MongoDB 在檢索之前將會動態調整查詢條件文檔的順 序,以使該查詢可以用到剛剛建立的複合索引。
對於上面建立的索引,MongoDB 都會根據索引的 keyname 和索引方向為新建立的索引 自動分配一個索引名,下面的命令可以在建立索引時為其指定索引名,如:

db.user.ensureIndex({"username":1},{"name":"userindex"})   

隨著集合的增長,需要針對查詢中大量的排序做索引。如果沒有對索引的鍵調用 sort, MongoDB 需要將所有資料提取到記憶體並排序。因此在做無索引排序時,如果資料量過大以 致無法在記憶體中進行排序,此時 MongoDB 將會報錯。 唯一索引

在預設情況下建立的索引均不是唯一索引。下面的樣本將建立唯一索引,如

db.user.ensureIndex({"userid":1},{"unique":true}) 

如果再次插入 userid 重複的文檔時,MongoDB 將報錯,以提示插入重複鍵,如:

db.user.insert({"userid":5})  db.user.insert({"userid":5}) 

E11000 duplicate key error index: user.user.$userid_1 dup key: { : 5.0 }

如果插入的文檔中不包含 userid 鍵,那麼該文檔中該鍵的值為 null,如果多次插入類似 的文檔,MongoDB 將會報出同樣的錯誤,如:

db.user.insert({"userid1":5}) db.user.insert({"userid1":5})  

E11000 duplicate key error index: user.user.$userid_1 dup key: { : null }

如果在建立唯一索引時已經存在了重複項,我們可以通過下面的命令協助我們在建立唯 一索引時消除重複項,僅保留髮現的第一個文檔,如:
先刪除剛剛建立的唯一索引

db.user.dropIndex({"userid":1}) 

插入測試資料,以保證集合中有重複鍵存在。

db.user.remove()     db.user.insert({"userid":5}) db.user.insert({"userid":5})      

重新建立唯一索引

db.user.ensureIndex({"userid":1},{"unique":true })   

我們同樣可以建立複合唯一索引,即保證複合索引值唯一即可。如:

db.user.ensureIndex({"userid":1,"age":1},{"unique":true})     
索引的一些參數

如果在為已有資料的文檔建立索引時,可以執行下面的命令,以使 MongoDB 在後台創 建索引,這樣的建立時就不會阻塞其他動作。但是相比而言,以阻塞方式建立索引,會使整 個建立過程效率更高,但是在建立時 MongoDB 將無法接收其他的操作。

db.user.ensureIndex({"username":1},{"background":true}) 
使用 explain

explain 是非常有用的工具,會協助你獲得查詢方面諸多有用的資訊。只要對遊標調用 該方法,就可以得到查詢細節。explain 會返回一個文檔,而不是遊標本身。如:

explain 會返回查詢使用的索引情況,耗時和掃描文檔數的統計資訊。 explain executionStats 查詢具體的執行時間

db.tablename.find().explain( "executionStats" ) 關注輸出的如下數值:explain.executionStats.executionTimeMillis 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.