MongoDB索引管理
一、创建索引
创建索引使用db.collectionName.ensureIndex(...)方法进行创建;
语法:
>db.COLLECTION_NAME.ensureIndex({KEY:1})
KEY 值为要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
ensureIndex() 也可以设置使用多个字段创建索引(在关系型数据库中称作复合索引)。
实例:
> db.yuyueCollection.ensureIndex({ "BR.registerdate" : 1, "BR.lastmodify" : 1},{'background':true})
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
参考实例一:创建普通索引
> db.users.ensureIndex({"name":1})
这样就在users这个集合上面的name字段上面创建了一个name_1的索引,{"name":1}说明建立的索引是升序的,如果{"name":-1}说明创建的索引是降序的。
参考实例二:创建普通复合索引
db.users.ensureIndex({"name":1,"age":1})
这样就在users这个集合上面的name和age字段上面创建了一个name_1_age_1的索引.
参考实例三:创建唯一索引
唯一索引可以确保集合里面的每一个文档指定的键都有唯一值。例如,如果想保证不同文档的name键拥有不同的值,创建一个唯一索引就可以了:
> db.dept.ensureIndex({"name":1},{"unique":true})
创建完唯一索引以后,如果想向dept集合中添加如下文档:
> db.dept.insert({ "_id" : 1, "name" : "ickes" })
> db.dept.insert({ "_id" : 2, "name" : "ickes" })
会发现只有第一个文档添加进去了,添加第二个时就会抛出异常,所以使用唯一索引来应对偶尔可能出现键重复的问题,而不是在运行时对重复键进行过滤。"_id"就是这中类型的索引,这个索引会在创建集合时自动创建。
参考实例四:创建复合唯一索引
创建复合唯一索引时,单个键的值可以相同,但是所有键的组合的值必须是唯一的。
> db.users.ensureIndex({"name":1,"age":1},{"unique":true})
参考实例五:创建唯一索引时去除重复
在已有的集合上面创建唯一索引时,可能失败,因为集合中可能已经存在重复值了,如下所示:
> db.dept.find()
{ "_id" : 1, "name" : "ickes" }
{ "_id" : 2, "name" : "ickes" }
{ "_id" : 3, "name" : "ickes1" }
{ "_id" : 4, "name" : "eks" }
{ "_id" : 5, "name" : "eks" }
--从上面的集合中看出name已经有大量重复值,创建唯一索引时抛出异常
> db.dept.ensureIndex({"name":1},{"unique":true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"ok" : 0,
"errmsg" : "E11000 duplicate key error index: test.dept.$name_1 dup key
: { : \"eks\" }",
"code" : 11000
}
通常需要对已有的数据进行处理(可以使用聚合框架,后面会说),找出重复的数据,想办法处理。
在极少数情况下,可能希望直接删除重复的值。创建索引时使用"dropDups"选项,如果遇到重复的值,第一个会被保留,之后的重复文档都会被删除。
> db.dept.ensureIndex({"name":1},{"unique":true,"dropDups":true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
"dropDups"会强制性的建立唯一索引,但是这个方式太粗暴了:你无法控制那些文档需要被保留,那些文档需要被删除(从上面打印的信息可以看出,如果文档被删除了,MongoDB也不会给出提示信息)。对于比较重要的数据,千万不要使用"dropDups".
参考实例六:创建稀疏索引
唯一索引会把null值看做值,所以无法将缺少键的多个文档插入到建立的唯一索引的集合中。然而,在某些情况下,你可能希望唯一索引只针对包含相应键的文档生效。如果有一个可能存在也有可能不存在的字段,当字段存在时是唯一索引,不存时不做处理,这时就可以将unique和sparse选项组合在一起使用。
使用sparse选项就可以创建稀疏索引。例如集合的结构如下:
> db.sparse.find()
{ "_id" : 1, "x" : 1 }
{ "_id" : 2, "x" : 2 }
{ "_id" : 3, "x" : null }
{ "_id" : 4 }
创建稀疏索引
> db.sparse.ensureIndex({"x":1},{"unique":true,"sparse":true})
稀疏索引不必是唯一的。只要去掉unique选项,就可以创建一个非唯一的稀疏索引
MongoDB的稀疏索引与关系型数据库中的稀疏索引是完全不同的概念。基本上来说,MongoDB中的稀疏索引只是不需要将每个文档都作为索引条目。那么问题来了,根据是否使用稀疏索引,同一个查询的返回结果可能不同。
例如上面文档,当在x上面执行查询时,他会返回相应匹配的文档:
> db.sparse.find({"x":{"$ne":1}}).hint({}) --hint({})强制不使用索引
{ "_id" : 2, "x" : 2 }
{ "_id" : 3, "x" : null }
{ "_id" : 4 }
如果在x字段上面使用索引,那么{ "_id" : 4 }的文档将不会返回,因为他不在索引中,例如:
> db.sparse.find({"x":{"$ne":1}}).hint({"x":1})
{ "_id" : 3, "x" : null }
{ "_id" : 2, "x" : 2 }
二、查看索引
所有数据库索引信息都存储在system.indexes集合中。这是一个保留集合,不能在其中插入或者删除文档。只能通过ensureIndex({...})或者dropIndexes对他进行操作:
参考实例一:查看所有数据库建立的索引详情
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.users" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.dept" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.food" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.emp" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.blog" }
................省略!
参考实例二:查看特定集合的索引信息
> db.users.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.users"
},
{
"v" : 1,
"key" : {
"name" : 1,
"age" : 1
},
"name" : "name_1_age_1",
"ns" : "test.users"
}
]
>
这里最重要的字段是key和name,key说明了你创建索引时字段跟排序,name就是索引的名称,默认为key_dir_key_dir....的格式,"v"字段只在内部使用,用于标识索引的版本。如果你的索引不包含“v”:1这样的字段,说明你的索引是一种效率比较低的旧方式存储的。将MongoDB升级到至少2.0的版本,删除并重建这些索引,就可以把所有的存储方式升级到新的格式了。
参考实例三:查看特定集合的索引信息
查询索引大小
db.COLLECTION_NAME.totalIndexSize()
三、标识索引
集合中的每一个索引都有一个名称,用于唯一标识索引,也可以用于服务器端来删除索引。索引默认的命名方式是key1_dir1_key2_dir2....keyn_dirn,其中key就是索引的键,dir是索引的排序方向(1或者-1),如果索引中包含的键比较多,这种默认的命名方式就显得比较笨重,可以再创建索引时指定索引的名称。
参考实例:
> db.users.ensureIndex({"name":1,"age":1},{"name":"name_age1"})
温馨提示:MongoDB索引名称的长度有限,所以新建复杂索引时可能需要自定义索引名称.
四、删除索引
参考实例一:删除集合里面的所有索引
> db.users.dropIndexes()
参考实例二:根据索引的key或者name删除集合里面的指定索引
> db.users.dropIndex("name_1_age_1")--根据索引的name删除
> db.users.dropIndex({"name":1,"age":1})--根据索引的key删除
MongoDB索引管理的更多相关文章
- MongoDB索引管理-索引的创建、查看、删除
索引是提高查询查询效率最有效的手段.索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中, ...
- 【四】MongoDB索引管理
一.索引介绍 在mongodb中,索引用来支持高效查询.如果没有索引,mongodb必须在整个集合中扫描每个文档来查找匹配的文档.但是如果建立合适的索引,mongodb就可以通过索引来限制检查的文档数 ...
- 分布式文档存储数据库之MongoDB索引管理
前文我们聊到了MongoDB的简介.安装和对collection的CRUD操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13941797.html:今天我 ...
- mongoDB索引相关
参考链接:MongoDB索引管理-索引的创建.查看.删除 索引 db.集合名.ensureIndex({"key":1}) 使用了ensureIndex在name上建立了索引.”1 ...
- mongodb数据库索引管理
1:ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引. 语法 ensureIndex()方法基本语法格式如下所示: }) 语法中 Key 值为你要创建的 ...
- MongoDB 索引的使用, 管理 和优化
MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报 分类: MongoDB(9) [使用explain和hint] 前面讲高级查询 ...
- MongoDB基本管理命令
MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中 可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由 ...
- NoSQL学习二:MongoDB基本管理命令
MongoDB命令学习 一.MongoDB命令帮助 在安装MongoDB后,启动服务器进程(mongod),可以通过在客户端命令mongo实现对MongoDB的管理和监控: 这是MongoDB最上层 ...
- MongoDB索引的使用
Table of Contents 1. 基本索引 2. 联合索引 3. 索引类型 4. 索引管理 1 基本索引 在数据库开发中索引是非常重要的,对于检索速度,执行效率有很大的影响.本 文主要描述了M ...
随机推荐
- Visual Studio中修改项目的输出目录
1. 如在Solution中的项目名称为 ProjectA 但在本地目录显示却想换成: MyProject 2. 应该做的修改是: 2.1. 将本地目录的 ProjectA手动修改成 MyProjec ...
- IdentityServer4授权模式应用场景
OpenID 和 OAuth 的区别 IdentityServer4,NET Core下的安全框架 客户端模式(Client Credentials) 密码模式(resource owner pass ...
- Java web验证码
绘制验证码的主要步骤: 1,设置宽度高度,验证码个数,干扰线个数,可选字符,背景颜色,字体格式 2,画干扰线,随机生成颜色,字体,字符 3,设置缓冲区,得到画笔,设置边框,读写数据,存储图片. 1,S ...
- Xcode日常使用
1.构建输出目录(Preferences->Locations->Locations)当选择为Default时,Derived Data的目录为~/Library/Developer/Xc ...
- JSON跨域问题总结
一.跨域问题的原因: 1 浏览器的检查 2 跨域 3 XMLHttpRequest请求二.跨域问题的解决: 1 禁止浏览器检查:使用dos命令,在启动浏览器的时候,加一个参数:chrome --dis ...
- tomcat绑定域名绑定端口及更换ROOT目录
一.更换ROOT目录 tomcat默认网站目录为 webapps/ROOT ,那么我们如何改为自己的网站目录呢? 1.打开并编辑tomcat目录下的 conf/server.xml 大约在148行的位 ...
- SpringBoot 开启debug
项目基于gradle ,今天想断点debug一下springboot,查阅资料后,纪录一下步骤. 创建Remote 创建gradle.properities 在当前项目下创建gradle.proper ...
- my docker note
环境: docker1.10.3 #hello docker docker run --name myhello docker.io/centos:67591570dd29 /bin/echo 'he ...
- [Java反射基础一]Class类的使用
任何一个类都是Class类的实例对象,这个实例对象有三种表示方式 第一种表示方式(任何一个类都有一个隐含的静态成员变量class): Class c1 = Foo.class; 第二种表示方式(已知该 ...
- maven(5)--依赖特性
依赖的子标签中有scope,常用值有compile.provide.test.runtime compile:编译范围有效,即编译和打包时都会将这个依赖存储 provide:编译测试有效,但是打包是将 ...