MongoDB 数据操作(六)索引(1)简介
来源:我的博客站 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
索引为系统默认,不可删除。只能删除自定义索引