文档章节

MongoDB索引类型-基础索引、复合索引、文档索引、唯一索引

Airship
 Airship
发布于 2018/06/01 16:33
字数 764
阅读 24
收藏 1

与关系型数据库一样,合理的使用索引可以大幅提高MongoDB的查询效率,本文介绍基础索引、复合索引、文档索引等几种常用索引的使用。

 

  1. 基础索引与复合索引
  2. 文档索引
  3. 唯一索引与强制使用索引

1. 基础索引与复合索引

1.1 基础索引

创建索引时,可以是一个集合中的一个或多个字段。

如,为用户表usersage字段,按升序创建索引:

db.users.ensureIndex({age:1})

当数据库中有大量数据时,创建索引的操作会非常耗时,我们可以指定backgroud:true选项:

db.users.ensureIndex({age:1}, {backgroud:true})

 

1.2 组合索引

为多个字段联合创建索引就是复合索引。

如,为users表的agecity两个字段,分别按升序和降序创建索引:

db.users.ensureIndex({age:1, city:-1})

创建复合索引后,在使用时应当注意:查询字段要在索引中存在,且顺序一致;如果索引中的首个字段没有出现在查询条件中,则不会用索引。

 

2. 文档索引

MongoDB可以为一个或多个字段创建索引,当字段是子文档时,同样可以创建索引。

如,users表中有以下数据:

{name:"IT笔录", address:{ city:"北京", district:"海淀区" }}

可以为address子文档创建索引如下:

db.users.ensureIndex({address:1})

建立索引后,查询时子文档的字段顺序要和查询顺序一致:

// 会使用索引
db.users.find({address:{ city:"北京", district:"海淀区" }})
// 不会使用索引
db.users.find({address:{ district:"海淀区", city:"北京" }})

对子文档创建索引时,也可以只对某一个或几个字段创建索引:

db.users.ensureIndex({"address.city":1})

 

3. 唯一索引与强制使用索引

3.1 唯一索引

在关系型数据库中,我们可以为字段创建唯一索引,以保证字段值的唯一。在MongoDB中同样可以使用唯一索引,MongoDB创建唯一索引,在创建索引时添加unique:true选项即可。

如,为users表的email字段创建唯一索引:

db.users.ensureIndex({email:1}, {unique:true})

创建唯一索引后,当插入重复值时,MongoDB会报错:

> db.users.insert({email:'x@itbilu.com'})
WriteResult({ "nInserted" : 1 })
>
> db.users.insert({email:'x@itbilu.com'})
WriteResult({
  "nInserted" : 0,
  "writeError" : {
    "code" : 11000,
    "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: itbilu.users.$mobile_1  dup key: { : null }"
  }
})

 

3.2 强制使用索引

在MongoDB的查询中,如果查询字段中的一个或几个字段已经创建了索引,我们可以使用hint()函数来强制使用索引。hint()在查询中是非常有效的一种优化手段:

如,我们要查询users表中的多个字段,查询字段中的age字段创建过索引,可以使用hint()来强制傅索引查询:

db.users.find({name:'IT笔录', age:3}).hint({age:1})

下一篇:MongoDB地理空间(2d)索引创建与查询

本文转载自:https://itbilu.com/database/mongo/VJG8tei0g.html

共有 人打赏支持
Airship
粉丝 40
博文 965
码字总数 20029
作品 0
南京
高级程序员
私信 提问
Mongodb与spring集成(2)------实体映射(转)

spring-data-mongodb中的实体映射是通过 MongoMappingConverter这个类实现的。它可以通过注释把 java类转换为mongodb的文档。 它有以下几种注释: @Id - 文档的唯一标识,在mongodb中为Objec...

挨踢职业人
2012/02/22
0
0
mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、等等)

最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的...

Airship
2018/06/01
0
0
小白必须懂的MongoDB的十大总结

小白必须懂的MongoDB的十大总结 Angel_Kitty 发表于小樱的经验随笔订阅 1.7K 在这篇文章中: 小白必须懂的MongoDB的总结 一、MongoDB的认识 二、MongoDB的安装 三、MongoDB数据类型及常用命令...

linjin200
02/22
0
0
浅尝辄止MongoDB:操作(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82882703 目录 5. 批处理数据 6. 重命名集合 7. 删除数据 8. 引用数据库 9. 使用与索...

wzy0623
2018/09/28
0
0
MongoDB学习笔记(六) MongoDB索引用法和效率分析

MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致。由于集合中的键(字段)可以是普通数据类型,也可以是子文档。MongoDB可以在各种类型的键上...

李长春
2011/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 集成 Swagger,生成接口文档就这么简单!

之前的文章介绍了《推荐一款接口 API 设计神器!》,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单。 你所需具备的基础 告诉你,Spring Boot 真是个牛逼货! ...

Java技术栈
26分钟前
3
0
一个简单的js作用域题目(原创)

var name = 'nnmm' var obj = { name: 'name1', func: () => { console.log(this.name) }, func1: function (){ console.log(this.name) }, son: { ......

boogoogle
29分钟前
2
0
SSM整合activeMQ/activeMQ配置

一、引入依赖 <!-- xbean 如<amq:connectionFactory /> -->    <dependency>        <groupId>org.apache.xbean</groupId>        <artifactId>xbean-spring</artifac......

嘴角轻扬30
33分钟前
2
0
小公司出身的程序员,面试咋这么难?!

小公司出身,被大厂竞争者 KO 以下是一个非常真实的案例,是一个大厂工程师和一个小公司工程师同时求职一个独角兽公司的职位的经历。 一个是985本科学历,出身互联网大厂,四五年经验的样子。...

编程SHA
39分钟前
2
0
揭秘:蚂蚁金服bPaaS究竟是什么?

摘要: 分布式金融核心套件,蚂蚁金服bPaaS究竟是什么东东? 文/图 孙浩峰 去年9月,蚂蚁金服在杭州云栖ATEC发布了分布式金融核心套件bPaaS( Business Platform As a Service ),对外开放自...

阿里云官方博客
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部