索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。html
這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。正則表達式
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構mongodb
MongoDB使用CreateIndex() 方法來建立索引數據庫
說明:數據結構
語法中 Key值例如x和y,爲你要建立的索引字段,1 爲指定按升序建立索引,若是你想按降序來建立索引指定爲 -1 便可,tse爲表名!ide
createIndex() 方法中你也能夠設置使用多個字段建立索引(關係型數據庫中稱做複合索引)。工具
建立單列索引: db.tse.createIndex({x:1},{name:'ix_tsex',background:true}) 建立多列索引: db.tse.createIndex({x:1 ,y:-1},{name:'ix_tse_xy',background:true}) 建立嵌套單列索引: db.tse.insert({x:{y:1}}) db.tse.createIndex({x.y:1},{name:'ix_tse_xy',background:true}) db.tse.find({"x.y":1}) #x.y = 1 建立嵌套子文檔單列索引: db.tse.createIndex({tse.uid:1},{name:'ix_tse_tse.uid',background:true}) 建立惟一索引: db.tse.createIndex({x:1 ,y:-1},{name:'uix_tse_xy',background:true,unique:true}) 查看集合中的索引: db.tse.getIndexes() 查看集合索引大小: db.tsel.totalIndexSize() 刪除索引: db.tse.dropIndex("ix_tse_xy") #ix_tse_xy是索引名 刪除集合全部索引: db.tse.dropIndexes() 檢查語句是否使用到索引: db.tse.find({"tse.uid":1}).explain() #tse是表名,tse.uid是嵌套子文檔
createIndex() 接收可選參數,可選參數列表以下:性能
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引過程會阻塞其它數據庫操做,background可指定之後臺方式建立索引,即增長 "background" 可選參數。 "background" 默認值爲false。 |
unique | Boolean | 創建的索引是否惟一。指定爲true建立惟一索引。默認值爲false. |
name | string | 索引的名稱。若是未指定,MongoDB的經過鏈接索引的字段名和排序順序生成一個索引名稱。 |
dropDups | Boolean | 3.0+版本已廢棄。在創建惟一索引時是否刪除重複記錄,指定 true 建立惟一索引。默認值爲 false. |
sparse | Boolean | 對文檔中不存在的字段數據不啓用索引;這個參數須要特別注意,若是設置爲true的話,在索引字段中不會查詢出不包含對應字段的文檔.。默認值爲 false. |
expireAfterSeconds | integer | 指定一個以秒爲單位的數值,完成 TTL設定,設定集合的生存時間。 |
v | index version | 索引的版本號。默認的索引版本取決於mongod建立索引時運行的版本。 |
weights | document | 索引權重值,數值在 1 到 99,999 之間,表示該索引相對於其餘索引字段的得分權重。 |
default_language | string | 對於文本索引,該參數決定了停用詞及詞幹和詞器的規則的列表。 默認爲英語 |
language_override | string | 對於文本索引,該參數指定了包含在文檔中的字段名,語言覆蓋默認的language,默認值爲 language. |
每一個索引佔據必定的存儲空間,在進行插入,更新和刪除操做時也須要對索引進行操做。因此,若是你不多對集合進行讀取操做,建議不使用索引。網站
因爲索引是存儲在內存(RAM)中,你應該確保該索引的大小不超過內存的限制。ui
若是索引的大小大於內存的限制,MongoDB會刪除一些索引,這將致使性能降低。
索引不能被如下的查詢使用:
因此,檢測你的語句是否使用索引是一個好的習慣,能夠用explain來查看。
檢查語句是否使用到索引: db.tse.find({"tse.uid":1}).explain() #tse是表名,tse.uid是嵌套子文檔
從2.6版本開始,若是現有的索引字段的值超過索引鍵的限制,MongoDB中不會建立索引。
若是文檔的索引字段值超過了索引鍵的限制,MongoDB不會將任何文檔轉換成索引的集合。與mongorestore和mongoimport工具相似。
參考:菜鳥教程