来源:我的博客站 OceanicKang |《MongoDB 数据操作(六)索引(1)简介》
在任何的数据库之中,索引都是一种提升数据库检索性能的手段,这一点在 MongoDB 数据库中同样存在
MongoDB 数据库里面存在两种索引创建:自动创建、手动创建
此时在 students 集合上并没有设置任何的索引,那么下面通过 getIndexes() 函数来观察在 students 集合里面已经存在的索引内容
查询默认状态下的
students集合的索引内容
> db.students.getIndexes();
存在一个 _id 列的索引内容
但是如果要想创建自己的索引,则可以使用如下的语法完成:
- 索引创建:
db.集合.createIndex({key: 1});,1 表示升序排列,-1 表示降序排列
创建一个索引,在
age字段上设置一个降序索引
> db.students.createIndex({"age": -1});
此时索引的名字是自动命名的,命名规范:字段_索引模式
针对当前的
age字段上的索引做一个分析
> db.students.find({"age": 20}).explain();
此时的查询使用了索引的技术,当前的扫描形式是索引扫描
下面再来观察一个不使用索引字段的查询
针对
score字段设置查询
> db.students.find({"score": 70}).explain();
此时在 score 字段上并没有设置索引,所以当前的扫描形式就变为了全集合扫描
age字段和score字段一起查询
> db.students.find({"age": 20, "score": 70}).explain();
这时候,虽然 age 字段上存在索引,但是由于 score 字段上没有索引,此时的扫描形式仅针对 age 字段做索引扫描
那么为了解决此时的问题,可以使用一个复合索引
age和score复合索引
> db.students.createIndex({"age": -1, "score": -1}, {"name": "age_score_-1"});
此时再进行一次查询
> db.students.find({"age": 20, "score": 70}).explain();
常规操作是默认使用索引
在条件查询中只进行全集合扫描
> db.students.find({"$or": [
{"age": {"$gte": 20}},
{"score": {"$gte": 70}}
]}).explain();
让条件查询强制调用索引
> db.students.find({"$or": [
{"age": {"$gte": 20}},
{"score": {"$gte": 70}}
]}).hint({"age": -1, "score": -1}).explain();
如果正常来讲,这个代码根本就不可能调用默认的索引,而通过 hint() 函数却可以让其 调用 相关索引
注意是 调用,该索引必须是已经创建的索引,未创建过的索引无法强调用
同时,如果在一个集合里设置了过多的索引,会导致性能下降,因此好钢要用在刀刃上
如果索引实在过多,也可以删除索引
删除一个索引
> db.students.dropIndex("age_score_-1");
清空索引
> db.students.dropIndexes();
_id 索引为系统默认,不可删除。只能删除自定义索引
下一篇:《MongoDB 数据操作(六)索引(2)唯一索引》