與關係型數據庫同樣,合理的使用索引能夠大幅提升MongoDB的查詢效率,本文介紹基礎索引、複合索引、文檔索引等幾種經常使用索引的使用。html
建立索引時,能夠是一個集合中的一個或多個字段。數據庫
如,爲用戶表users
的age
字段,按升序建立索引:函數
db.users.ensureIndex({age:1})
當數據庫中有大量數據時,建立索引的操做會很是耗時,咱們能夠指定backgroud:true
選項:優化
db.users.ensureIndex({age:1}, {backgroud:true})
爲多個字段聯合建立索引就是複合索引。spa
如,爲users
表的age
和city
兩個字段,分別按升序和降序建立索引:code
db.users.ensureIndex({age:1, city:-1})
建立複合索引後,在使用時應當注意:查詢字段要在索引中存在,且順序一致;若是索引中的首個字段沒有出如今查詢條件中,則不會用索引。htm
MongoDB能夠爲一個或多個字段建立索引,當字段是子文檔時,一樣能夠建立索引。索引
如,users
表中有如下數據:ci
{name:"IT筆錄", address:{ city:"北京", district:"海淀區" }}
能夠爲address
子文檔建立索引以下:文檔
db.users.ensureIndex({address:1})
創建索引後,查詢時子文檔的字段順序要和查詢順序一致:
// 會使用索引 db.users.find({address:{ city:"北京", district:"海淀區" }}) // 不會使用索引 db.users.find({address:{ district:"海淀區", city:"北京" }})
對子文檔建立索引時,也能夠只對某一個或幾個字段建立索引:
db.users.ensureIndex({"address.city":1})
在關係型數據庫中,咱們能夠爲字段建立惟一索引,以保證字段值的惟一。在MongoDB中一樣可使用惟一索引,MongoDB建立惟一索引,在建立索引時添加unique:true
選項便可。
如,爲users
表的email
字段建立惟一索引:
db.users.ensureIndex({email:1}, {unique:true})
建立惟一索引後,當插入重複值時,MongoDB會報錯:
> db.users.insert({email:'x@itbilu.com'}) WriteResult({ "nInserted" : 1 }) > > db.users.insert({email:'x@itbilu.com'}) WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: itbilu.users.$mobile_1 dup key: { : null }" } })
在MongoDB的查詢中,若是查詢字段中的一個或幾個字段已經建立了索引,咱們可使用hint()
函數來強制使用索引。hint()
在查詢中是很是有效的一種優化手段:
如,咱們要查詢users
表中的多個字段,查詢字段中的age
字段建立過索引,可使用hint()
來強制傅索引查詢:
db.users.find({name:'IT筆錄', age:3}).hint({age:1})