MongoDB 后台创建索引、查看创建进度等
一、索引创建方式
前台方式
缺省情况下,当为一个集合创建索引时,这个操作将阻塞其他的所有操作。即该集合上的无法正常读写,直到索引创建完毕
任意基于所有数据库申请读或写锁都将等待直到前台完成索引创建操作
后台方式
将索引创建置于到后台,适用于那些需要长时间创建索引的情形
这样子在创建索引期间,MongoDB依旧可以正常的为提供读写操作服务
等同于关系型数据库在创建索引的时候指定online,而MongoDB则是指定background
其目的都是相同的,即在索引创建期间,尽可能的以一种占用较少的资源占用方式来实现,同时又可以提供读写服务
后台创建方式的代价:索引创建时间变长
后台创建索引的示例
db.people.createIndex( { zipcode: 1}, {background: true} )
db.people.createIndex( { city: 1}, {background: true, sparse: true } )
缺省情况下background选项的值为false
二、索引创建期间注意事项
如前所述,基于后台创建索引时,其他的数据库操作能被完成。但是对于mongo shell会话或者你正在创建索引的这个连接将不可用,直到所有创建完毕。如果需要做一些其它的操作。则需要再建立其它的连接。
在索引创建期间,即使完成了部分索引的创建,索引依旧不可用,但是一旦创建完成即可使用。
基于后台创建索引期间不能完成涉及该集合的相关管理操作
repairDatabase
db.collection.drop()
compact
意外中断索引创建
如果在后台创建索引期间,mongod实例异常终止,当mongod实例重新启动后,未完成的索引创建将作为前台进程来执行
如果索引创建失败,比如由于重复的键等,mongod将提示错误并退出
在一个索引创建失败后启动mongod,可以使用storage.indexBuildRetry or --noIndexBuildRetry跳过索引创建来启动
三、索引创建期间性能
后台创建索引比前台慢,如果索引大于实际可用内存,则需要更长的时间来完成索引创建
所有涉及到该集合的相关操作在后台期间其执行效能会下降,应在合理的维护空挡期完成索引的创建
四、索引的命名规则
缺省情况下,索引名以键名加上其创建顺序(1或者-1)组合而成。
db.products.createIndex( { item: 1, quantity: -1 } )
比如上面的索引创建后,其索引名为item_1_quantity_-1
可以指定自定义的索引名称
db.products.createIndex( { item: 1, quantity: -1 } , { name: "inventory_idx" } )
如上方式,我们指定了了索引名称为inventory_idx
五、查看索引创建进度
可使用 db.currentOp() 命令观察索引创建的完成进度
> db.currentOp({$or: [{ op: "command", "query.createIndexes": { $exists: true } },{ op: "insert", ns: /\.system\.indexes\b/ }]})
//下面通过一个索引创建示例来查看索引完成进度
//首选创建一个500w文档的集合
> db.version() // Author : Leshami3.2.10 // Blog : http://blog.csdn.net/leshami> for (var i=1;i<=5000000;i++){db.inventory.insert({id:i,item:"item"+i,stock:Math.floor(i*Math.random())})}WriteResult({ "nInserted" : 1 })> db.inventory.find().limit(3){ "_id" : ObjectId("581bfc674b0d633653f4427e"), "id" : 1, "item" : "item1", "stock" : 0 }{ "_id" : ObjectId("581bfc674b0d633653f4427f"), "id" : 2, "item" : "item2", "stock" : 0 }{ "_id" : ObjectId("581bfc674b0d633653f44280"), "id" : 3, "item" : "item3", "stock" : 1 }> db.inventory.find().count()5000000
//下面开始创建索引
> db.inventory.createIndex({item:1,unique:true})
//使用下面的命令查看索引完成进度
> db.currentOp({$or: [{ op: "command", "query.createIndexes": { $exists: true } },{ op: "insert", ns: /\.system\.indexes\b/ }]})
结果如下
{"inprog" : [{"desc" : "conn1", //连接描述 "threadId" : "139911670933248", //线程id"connectionId" : 1, "client" : "127.0.0.1:37524", //ip及端口"active" : true, //活动状态"opid" : 5014925,"secs_running" : 21, //已执行的时间"microsecs_running" : NumberLong(21800738), "op" : "command","ns" : "test.$cmd","query" : {"createIndexes" : "inventory", //这里描述了基于inventory正在创建索引"indexes" : [{"ns" : "test.inventory","key" : {"item" : 1,"unique" : true},"name" : "item_1_unique_true"}]},"msg" : "Index Build Index Build: 3103284/5000000 62%", //这里是完成的百分比"progress" : {"done" : 3103722,"total" : 5000000},"numYields" : 0,"locks" : { //当前持有的锁"Global" : "w","Database" : "W","Collection" : "w"},"waitingForLock" : false,"lockStats" : { //锁的状态信息"Global" : {"acquireCount" : {"r" : NumberLong(1),"w" : NumberLong(1)}},"Database" : {"acquireCount" : {"W" : NumberLong(1)}},"Collection" : {"acquireCount" : {"w" : NumberLong(1)}}}}],"ok" : 1}
基于后台方式创建索引
> db.inventory.createIndex({item:1,unique:true},{background: true})
六、终止索引的创建
db.killOp()
MongoDB 后台创建索引、查看创建进度等相关推荐
- 索引语法——创建索引 || 查看索引 || 删除索引 || ALTER命令 索引设计原则
索引语法 索引在创建表的时候,可以同时创建,也可以随时增加新的索引. 准备环境: 创建索引 查看索引 删除索引 ALTER命令 索引设计原则 索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑 ...
- 一篇文章带你搞定 MongoDB 中的索引(创建/查看/删除)
索引就像图书的目录一样,可以让我们快速定位到需要的内容,关系型数据库中有索引,NoSQL 中当然也有,本文我们就先来简单介绍下 MongoDB 中的索引. 文章目录 一.索引创建 二.查看索引 三.删 ...
- 【oracle】oracle创建表、创建索引、创建自增id
说实话oracle实在用不习惯,虽然已经使用近两年了. 可能是习惯问题吧!毕竟mysql和mssql使用的更频繁 1.oracle创建表 创建表还是比较简单的 -- oracle 创建数据库表 CRE ...
- mysql按升序创建索引_Mysql创建索引
摘自:http://blog.chinaunix.net/uid-25063573-id-3032578.html 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技 ...
- oracle怎么么创建索引,Oracle 创建索引,oracle索引怎么创建
Oracle 创建索引,oracle索引怎么创建 索引是数据库服务器用来加快检索的速度,再通过加了索引的列进行检索 时候,数据库会自动使用索引,使用索引所在的列值进行快速检索,快速定位到 真实的数据内 ...
- oracle视图如何创建索引,ORACLE 创建视图索引序列
/* 视图View 视图是从若干基本表和(或)其他视图构造出来的表 视图存放的都是查询语句,并没有真实的数据 虚表 作用 限制对数据的操作 复杂查询变简单 提供相同数据的不同显示 UNION ALL ...
- MySQL-->索引-->如何创建索引,创建原则
1.可视化创建 2.语句创建 普通索引(NORMAL): CREATE INDEX index_name ON table_name(table_colum1(length)) 唯一索引(UNIQUE ...
- c mysql创建索引,如何创建mysql索引
索引是一种特殊的文件(innodb数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 注: [1]索引不是万能的! 索引可以加快数据检索操作,但会使数据修改操作变慢.每修 ...
- mySQL数据表创建索引_MySQL创建数据表 建索引
除非注明,文章均为易水寒原创,版权属于易水寒博客,转载请注明出处,谢谢. 三.数据字段属性: 1.unsigned 可以让空间增加一倍,如果不希望在字段中插入负值就使用此属性,另外只能用在数值型字段. ...
- mysql按升序创建索引_MySQL创建索引(CREATE INDEX)
创建索引是指在某个表的一列或多列上建立一个索引,可以提高对表的访问速度.创建索引对 MySQL 数据库的高效运行来说是很重要的. 基本语法 MySQL 提供了三种创建索引的方法: 1) 使用 CREA ...
最新文章
- QtCreator动态编译jsoncpp完美支持x86和arm平台
- 除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询...
- java capacity_关于Java中StringBuffer的capacity问题
- Python中类方法、类实例方法、静态方法,私有属性和私有方法有何区别?
- C++中的多态(一)
- ST-Link如何秒变J-link,手把手教你实现该功能
- 解决git提交问题error: The requested URL returned error: 403 Forbidden while accessing
- Android代码抄袭Java曝猛料 新证据出现
- html5 视频 showtime,利用function showTime显示不出时间是为什么?
- SpringBoot 小技巧
- 操作系统学习(二)、分段机制
- 数据中台对企业意义和作用有哪些
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_7_常用的函数式接口_Supplier接口...
- Android好用的工具-监测,性能,网络等
- [转]3D Ripper DX模型截取器
- docker容器2:镜像制作
- 再战中原之收集霸王大陆的资料
- 快速查看网页元素的CSS样式
- 顺丰快递 : 请收下 MySQL 灵魂十连
- 选中物体高亮显示(MR开发日志)
热门文章
- 如何下载百度地图离线包并导入OruxMaps
- ADS1115的四通道使用
- Can‘t open /dev/sdb1 exclusively. Mounted filesystem?
- 怎样用html制作歌词字幕,pr歌词字幕制作方法
- serv-u and hway3.0
- 为Visual Studio创建项目模板(VSIX / C#/ 2019)
- QT修改releas发布的exe图标
- picgo+onedrive+Typora用onedrive当图床
- 什么是计算机的用户名和密码,电脑用户名是什么意思
- Warbler, A Little Birdie To Introduce Your Rails App To Java