MongoDB 中索引的类型大致包含单键索引、复合索引、多键值索引、地理索引、全文索引、 散列索引等,下面简单介绍各类索引的用法。
1、单字段索引
这个是最简单最常用的索引类型,比如我们上边的例子,为id建立一个单独的索引就是此种类型。
# 为id field建立索引,1表示升序,-1表示降序,没有差别
db.employee.createIndex({‘id‘: 1})
需要注意的是通常MongoDB会自动为我们的文档插入‘_id‘ field,且已经按照升序进行索引,如果我们插入的文档中包含有‘_id‘ field,则MongoDB就不会自动创建‘_id‘ field,但是需要我们自己来保证唯一性从而唯一标识一个文档
2、复合索引
上图查询索引的时候会先查询userid,再查询score,然后就可以找到对应的文档。
对于复合索引需要注意以下几点:
索引field的先后顺序很关键,影响有两方面:
1、MongoDB在复合索引中是根据prefix排序查询,就是说排在前面的可以单独使用。
我们创建一个如下的索引
db.collection.createIndex({‘id‘: 1, ‘city‘: 1, ‘score‘: 1})
我们如下的查询可以利用索引
db.collection.find({‘id‘: xxx})
db.collection.find({‘id‘: xxx, ‘city‘: xxx})
db.collection.find({‘id‘: xxx, ‘city‘:xxx, ‘score‘: xxxx})
但是如下的查询无法利用该索引
db.collection.find({‘city‘: xxx})
db.collection.find({‘city‘:xxx, ‘score‘: xxxx})
还有一种特殊的情况,就是如下查询:
db.collection.find({‘id‘: xxx, ‘score‘: xxxx})
这个查询也可以利用索引的前缀‘id‘来查询,但是却不能针对score进行查询,你可以说是部分利用了索引,因此其效率可能不如如下索引:
db.collection.createIndex({‘id‘: 1, ‘score‘: 1})
2.过滤出的document越少的field越应该放在前面,比如此例中id如果是唯一的,那么就应该放在最前面,因为这样通过id就可以锁定唯一一个文档。而如果通过city或者score过滤完成后还是会有大量文档,这就会影响最终的性能。
索引的排序顺序不同
复合索引最末尾的field,其排序顺序不同对于MongoDB的查询排序操作是有影响的。
比如:
db.events.create