1、什麼是索引。mongodb
索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。數據庫
這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。數據結構
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構。
ide
2、索引的操做方法。
性能
1.建立普通索引。
網站
MongoDB使用 createIndex() 方法來建立索引createIndex()方法基本語法格式以下所示:spa
db.collection.createIndex(keys, options)orm
#語法中 Key 值爲你要建立的索引字段,1 爲指定按升序建立索引,若是你想按降序來建立索引指定爲 -1 便可。排序
db.col.createIndex({"title":1})索引
#語法中 Key 值爲你要建立的索引字段,1 爲指定按升序建立索引,若是你想按降序來建立索引指定爲 -1 便可。
#createIndex方法下有以下參數。
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. |
2.建立惟一索引。
db.col.createIndex({"title":1},{unique:true})
3.建立聯合索引。
當聯合查詢的操做比較多,推薦使用聯合索引。
例:
db.user.createIndex({'height':1}{'birthday':1})
#將height 和 birthday 建立了聯合索引。
#符合索引對單條件查詢是不生效的!!!複合索引只對聯合查詢生效!
4.查索引是否生效。
當執行了一個查詢操做,想知道這個查詢操做是否走了索引,仍是全表查詢,能夠使用explain()這個方法來查看。
db.tmp.find({"name":"aaa"}).explain()
#咱們只須要關注結果返回的stage 字段,當stage字段爲"COLLSCAN"時,表明了這個查詢結果是全表掃描的,沒有命中索引。
當stage字段爲ixscan時,則表明索引掃描。
5.全文索引。
注意!!一個集合中,只能建立一個全文索引!!可是全文索引能夠建多個列!!
建立全文索引:
db.tmp.createIndex({"testtxt":''text"})
當建立了全文索引後,按照以前正常的查詢方法是不會通過全文索引的,若是查找須要通過全文索引,須要有特殊的語法。
db.tmp.find({testtxt:"aaa"}) #普通查找
db.tmp.find({$text:{$search:"aaa"}}) #經過全文索引進行查找。
#用普通索引能夠進行模糊查詢,可是全文索引就不能夠!
經過全文索引來進行or(或)查詢:
db.tmp.find($text:{$search:"ayumi kodakumi"}) #在全文索引中找出包含有ayumi或kodakumi的字段。
#普通的索引是經過首字母排序,全文索引的原理則是分詞。
#若是須要作中文的全文索引,不推薦使用mongodb,由於mongo的中文分詞作的很差,並且當數據量較大時,查詢很慢!