MongoDB 数据操作(六)索引(1)简介

来源:我的博客站 OceanicKang |《MongoDB 数据操作(六)索引(1)简介》

上一篇:《MongoDB 数据操作(五)游标》

在任何的数据库之中,索引都是一种提升数据库检索性能的手段,这一点在 MongoDB 数据库中同样存在

MongoDB 数据库里面存在两种索引创建:自动创建、手动创建

此时在 students 集合上并没有设置任何的索引,那么下面通过 getIndexes() 函数来观察在 students 集合里面已经存在的索引内容

查询默认状态下的 students 集合的索引内容

> db.students.getIndexes();

1.png

存在一个 _id 列的索引内容

但是如果要想创建自己的索引,则可以使用如下的语法完成:

  • 索引创建:db.集合.createIndex({key: 1});,1 表示升序排列,-1 表示降序排列

创建一个索引,在 age 字段上设置一个降序索引

> db.students.createIndex({"age": -1});

2.png

此时索引的名字是自动命名的,命名规范:字段_索引模式

针对当前的 age 字段上的索引做一个分析

> db.students.find({"age": 20}).explain();

3.png

此时的查询使用了索引的技术,当前的扫描形式是索引扫描

下面再来观察一个不使用索引字段的查询

针对 score 字段设置查询

> db.students.find({"score": 70}).explain();

4.png

此时在 score 字段上并没有设置索引,所以当前的扫描形式就变为了全集合扫描

age 字段和 score 字段一起查询

> db.students.find({"age": 20, "score": 70}).explain();

5.png

这时候,虽然 age 字段上存在索引,但是由于 score 字段上没有索引,此时的扫描形式仅针对 age 字段做索引扫描

那么为了解决此时的问题,可以使用一个复合索引

agescore 复合索引

> db.students.createIndex({"age": -1, "score": -1}, {"name": "age_score_-1"});

6.png

此时再进行一次查询

> db.students.find({"age": 20, "score": 70}).explain();

7.png

常规操作是默认使用索引

在条件查询中只进行全集合扫描

> db.students.find({"$or": [
      {"age": {"$gte": 20}},
      {"score": {"$gte": 70}}
  ]}).explain();

8.png

让条件查询强制调用索引

> db.students.find({"$or": [
      {"age": {"$gte": 20}},
      {"score": {"$gte": 70}}
  ]}).hint({"age": -1, "score": -1}).explain();

9.png

如果正常来讲,这个代码根本就不可能调用默认的索引,而通过 hint() 函数却可以让其 调用 相关索引

注意是 调用,该索引必须是已经创建的索引,未创建过的索引无法强调用

同时,如果在一个集合里设置了过多的索引,会导致性能下降,因此好钢要用在刀刃上

如果索引实在过多,也可以删除索引

删除一个索引

> db.students.dropIndex("age_score_-1");

10.png

清空索引

> db.students.dropIndexes();

11.png

_id 索引为系统默认,不可删除。只能删除自定义索引

下一篇:《MongoDB 数据操作(六)索引(2)唯一索引》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值