建立常用的mongo索引

本文详细介绍了MongoDB中如何建立索引,包括6种常用的索引类型:单字段、唯一、复合、多key、部分和稀疏索引。强调了复合索引在查询优化中的重要性,以及在创建索引时应注意的颗粒度和排序问题。同时,提到了explain方法用于查询计划分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建立索引方式

1. 是在schema定义字段时
2. 通过index方法给schema添加
3. db.modle.creatIndex({filed: 1}) mongo shell添加索引

索引属性

1. index: 布尔值 是否对这个属性创建索引
2. unique: 布尔值 是否对这个属性创建唯一索引
3. sparse: 布尔值 是否对这个属性创建稀疏索引
4. partialFilterExpression object 对这个属性进行部分索引

索引类型(6种常用)

1. 单字段索引

对于单字段索引,升序/降序效果是一样
在这里插入图片描述

2. 唯一索引

保证索引对应的字段不会出现相同的值,比如_id索引就是唯一索引
除了唯一约束之外,唯一索引在功能上可与其他MongoDB索引互换。

在这里插入图片描述

3. 复合索引

**多个字段上定义索引,即 复合索引

查询需求

应用场景: 为经常需要根据『name字段』以及『name和age字段组合』来查询
在这里插入图片描述
复合索引中字段的排序很重要 userSchema.index( {name: 1, age: 1} )

  1. 先按第一个字段name排序,第一个字段相同的文档按第二个字段age排序,依次类推。
  2. 不光能满足多个字段组合起来的查询,也能满足所以能匹配符合索引前缀(这里前缀为{name:1} ) 的查寻,即db.user.find( {age: 18} ) 的查询也能通过该索引来加速。
    注: 复合索引和升降序的爱恨情仇
    在这里插入图片描述

4. 多key索引

这个主要是针对数据类型为数组的类型 ):(shell)
在这里插入图片描述

5.部分索引

仅索引符合指定过滤表达式的集合中的文档(较低的存储要求,并降低了索引创建和维护的性能成本)

要创建partial索引,请将db.collection.createIndex()方法与partialFilterExpression(部分涮选条件)选项一起使用。 partialFilterExpression选项接受使用以下内容指定过滤条件的文档:

  1. 等式表达式(field: value或使用$eq operator),
  2. $exists:true表达,
  3. g t , gt, gtgte, l t , lt, ltlte表达式
    例子:(shell)
    在这里插入图片描述

Schema设置索引

const UsersSchema = new Schema({
  name: {type: String, trim: true, index: true, required: true},
  email: {
    type: String, trim: true, index: {
      unique: true,
      partialFilterExpression: {email: {$type: 'string'}}
    }
  }
})

6. 稀疏索引

索引会跳过缺少索引字段的任何文档。配合唯一索引使用,即可实现对存在的字段才使用唯一索引。

要创建稀疏索引,请将db.collection.createIndex()方法与sparse(稀疏,搭配unique)选项一起使用

应用场景

同时支持手机号和邮箱,用户可能使用手机号注册,则邮箱为null。而唯一索引对于会认为null 也是重复的数据。导致手机号加入到数据库中失败。这些对于可选但也应该是唯一的字段特别有用
例子:(shell)

Schema.index( { email:  1 }, { sparse: true, unique: true } );

建立索引注意事项

  1. 索引列颗粒越小越好(索引列中每个数据的重复数量称为颗粒,也叫作索引的基数)
  2. 在建立索引时要尽量将数据颗粒小的列放在索引左侧,以保证索引发挥最大的作用。(颗粒小的数据放左边,大的放右边,查询速度更加快)
  3. MongoDB在复合索引中是根据prefix (前缀) 排序查询,就是说排在前面的可以单独使用。
  4. 通常MongoDB会自动为我们的文档插入’_id’ field,且已经按照升序(小->大)1 进行索引,如果我们插入的文档中包含有’_id’ field,则MongoDB就不会自动创建’_id’ field,需要我们保证唯一性从而唯一标识一个文档。
  5. MongoDB 提供db.collection.explain(), cursort.explain()及explain 命令获取查询计划及查询计划执行统计信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值