与关系型数据库一样,合理的使用索引可以大幅提高MongoDB的查询效率,本文介绍基础索引、复合索引、文档索引等几种常用索引的使用。
1. 基础索引与复合索引
1.1 基础索引
创建索引时,可以是一个集合中的一个或多个字段。
如,为用户表users
的age
字段,按升序创建索引:
db.users.createIndex
({age:1})
当数据库中有大量数据时,创建索引的操作会非常耗时,我们可以指定backgroud:true
选项:
db.users.createIndex
({age:1}, {backgroud:true})
1.2 组合索引
为多个字段联合创建索引就是复合索引。
如,为users
表的age
和city
两个字段,分别按升序和降序创建索引:
db.users.createIndex
({age:1, city:-1})
创建复合索引后,在使用时应当注意:查询字段要在索引中存在,且顺序一致;如果索引中的首个字段没有出现在查询条件中,则不会用索引。
2. 文档索引
MongoDB可以为一个或多个字段创建索引,当字段是子文档时,同样可以创建索引。
如,users
表中有以下数据:
{name:"IT笔录", address:{ city:"北京", district:"海淀区" }}
可以为address
子文档创建索引如下:
db.users.createIndex({address:1})
建立索引后,查询时子文档的字段顺序要和查询顺序一致:
// 会使用索引 db.users.find({address:{ city:"北京", district:"海淀区" }}) // 不会使用索引 db.users.find({address:{ district:"海淀区", city:"北京" }})
对子文档创建索引时,也可以只对某一个或几个字段创建索引:
db.users.createIndex({"address.city":1})
3. 唯一索引与强制使用索引
3.1 唯一索引
在关系型数据库中,我们可以为字段创建唯一索引,以保证字段值的唯一。在MongoDB中同样可以使用唯一索引,MongoDB创建唯一索引,在创建索引时添加unique:true
选项即可。
如,为users
表的email
字段创建唯一索引:
db.users.createIndex({email:1}, {unique:true})
创建唯一索引后,当插入重复值时,MongoDB会报错:
> db.users.insert({email:'[email protected]'}) WriteResult({ "nInserted" : 1 }) > > db.users.insert({email:'[email protected]'}) WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: itbilu.users.$mobile_1 dup key: { : null }" } })
3.2 强制使用索引
在MongoDB的查询中,如果查询字段中的一个或几个字段已经创建了索引,我们可以使用hint()
函数来强制使用索引。hint()
在查询中是非常有效的一种优化手段:
如,我们要查询users
表中的多个字段,查询字段中的age
字段创建过索引,可以使用hint()
来强制傅索引查询:
db.users.find({name:'IT笔录', age:3}).hint({age:1})
转自:https://itbilu.com/database/mongo/VJG8tei0g.html