建立索引方式
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} )
- 先按第一个字段name排序,第一个字段相同的文档按第二个字段age排序,依次类推。
- 不光能满足多个字段组合起来的查询,也能满足所以能匹配符合索引前缀(这里前缀为{name:1} ) 的查寻,即db.user.find( {age: 18} ) 的查询也能通过该索引来加速。
注: 复合索引和升降序的爱恨情仇
4. 多key索引
这个主要是针对数据类型为数组的类型 ):(shell)
5.部分索引
仅索引符合指定过滤表达式的集合中的文档(较低的存储要求,并降低了索引创建和维护的性能成本)
要创建partial索引,请将db.collection.createIndex()方法与partialFilterExpression(部分涮选条件)选项一起使用。 partialFilterExpression选项接受使用以下内容指定过滤条件的文档:
- 等式表达式(field: value或使用$eq operator),
- $exists:true表达,
-
g
t
,
gt,
gt,gte,
l
t
,
lt,
lt,lte表达式
例子:(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 } );
建立索引注意事项
- 索引列颗粒越小越好(索引列中每个数据的重复数量称为颗粒,也叫作索引的基数)
- 在建立索引时要尽量将数据颗粒小的列放在索引左侧,以保证索引发挥最大的作用。(颗粒小的数据放左边,大的放右边,查询速度更加快)
- MongoDB在复合索引中是根据prefix (前缀) 排序查询,就是说排在前面的可以单独使用。
- 通常MongoDB会自动为我们的文档插入’_id’ field,且已经按照升序(小->大)1 进行索引,如果我们插入的文档中包含有’_id’ field,则MongoDB就不会自动创建’_id’ field,需要我们保证唯一性从而唯一标识一个文档。
- MongoDB 提供db.collection.explain(), cursort.explain()及explain 命令获取查询计划及查询计划执行统计信息。