MongoDB 索引 explain 分析查詢速度

1、索引基礎
索引是對數據庫表中一列或多列的值進行排序的一種結構,可讓咱們查詢數據庫變得
更快。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 將會報錯。spa


2、惟一索引
在缺省狀況下建立的索引均不是惟一索引。下面的示例將建立惟一索引,如:
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}) 內存


3、索引的一些參數
若是在爲已有數據的文檔建立索引時,能夠執行下面的命令,以使 MongoDB 在後臺創
建索引,這樣的建立時就不會阻塞其餘操做。可是相比而言,以阻塞方式建立索引,會使整
個建立過程效率更高,可是在建立時 MongoDB 將沒法接收其餘的操做。
db.user.ensureIndex({"username":1},{"background":true})rem


4、使用 explain
 explain 是很是有用的工具,會幫助你得到查詢方面諸多有用的信息。只要對遊標調用
該方法,就能夠獲得查詢細節。explain 會返回一個文檔,而不是遊標自己。如:
 
explain 會返回查詢使用的索引狀況,耗時和掃描文檔數的統計信息。文檔


5、explain executionStats 查詢具體的執行
時間
db.tablename.find().explain( "executionStats" )關注輸出的以下數值:explain.executionStats.executionTimeMillis 

相關文章
相關標籤/搜索