1.唯一索引
唯一索引会保证索引对应的键不会出现相同的值,比如_id索引就是唯一索引 创建索引时也需要保证属性中内容是不重复的 语法格式:
代码语言:javascript复制db.COLLECTION_NAME.createIndex({
索引键名:排序规则},{
unique:true})
db.user.createIndex({
name:1},{
background:true,unique:true})
2.部分索引–就是带有过滤条件的索引
部分索引是只针对符合某个特定条件的文档建立索引,3.2版本才支持该特性。 语法格式:
代码语言:javascript复制db.COLLECTION_NAME.createIndex({
索引键名:排序规则},{
partialFilterExpression:{
键名:{
匹配条件:条件值}}})
给年龄字段添加索引,过滤条件是年龄大于50
代码语言:javascript复制db.user.createIndex({
age:1},{
partialFilterExpression:{
age:{
$gt:50}}})
查看执行计划,是否用到索引
代码语言:javascript复制当年龄是24时,没有用到索引
db.user.find({
age:{
$eq:24}}).explain()
"winningPlan": {
"stage": "COLLSCAN",
"filter": {
"age": {
"$eq": 24
}
},
"direction": "forward"
},
当年龄是54时,用到了索引
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"age": 1
},
"indexName": "age_1",
"isMultiKey": false,
"multiKeyPaths": {
"age": [ ]
},
3.稀疏索引
稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的任何文档。索引是“稀疏的”,因为它不包含集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。 语法格式:
代码语言:javascript复制db.COLLECTION_NAME.createIndex({
索引键名:排序规则},{
sparse:true})
注意:从MongoDB 3.2开始,MongoDB提供了创建部分索引的选项 。部分索引提供了稀疏索引功能的超集。如果您使用的是MongoDB 3.2或更高版本,则部分索引应优先于稀疏索引。
4.覆盖索引查询
官方的MongoDB的文档中说明,覆盖查询是以下的查询: 1.所有的查询字段是索引的一部分
2.所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引 的查询结果。 因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取数据要快得多。 如有如下索引: db.stu.createIndex({title:1,:size:1}) 那么执行如下查询时,该索引会覆盖查询: db.stu.find({title:“dev”},{size:1,_id:0}) 也就是说,对于上述查询,MongoDB的不会去数据库文件中查找。相反,它会从索引中提取数据,这是非常快速的数据查询。
5.查询计划
在MongoDB中通过explain()函数启动执行计划,我们可以使用查询计划分析索引的使用情况,可通过查看详细的查询计划来决定如何优化。 语法结构:db.COLLECTION_NAME.find().explain()