mongo之 前后台创建索引 --noIndexBuildRetry
在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程。MongoDB也不例外。因此,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会话或者你正在创建索引的这个连接将不可用,直到所有创建完毕。如果需要做一些其它的操作。则需要再建立其它的连接。在索引创建期间,即使完成了部分索引的创建,索引依旧不可用,但是一旦创建完成即可使用。基于后台创建索引期间不能完成涉及该集合的相关管理操作repairDatabasedb.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()
mongo之 前后台创建索引 --noIndexBuildRetry的更多相关文章
- linux环境给mongodb创建索引
首先我们来了解索引,如果有基础的可以直接看最后面的操作. 可参照 DoNotStop 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/u013725455/artic ...
- Elasticsearch之curl创建索引库
关于curl的介绍,请移步 Elasticsearch学习概念之curl 启动es,请移步 Elasticsearch的前后台运行与停止(tar包方式) Elasticsearch的前后台运行与停止( ...
- MongoDB排序时内存大小限制和创建索引的注意事项!
线上服务的MongoDB中有一个很大的表,我查询时使用了sort()根据某个字段进行排序,结果报了下面这个错误: [Error] Executor error during find command ...
- SQL语句-创建索引
语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100 GO USE 库名GO IF EXISTS (SELECT * FRO ...
- *使用while循环遍历数组创建索引和自增索引值
package com.chongrui.test;/* *使用while循环遍历数组 * * * */public class test { public static void main ...
- 程序员眼中的 SQL Server-执行计划教会我如何创建索引?
先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...
- SQL Server创建索引(转)
什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音. ...
- hive创建索引
索引是hive0.7之后才有的功能,创建索引需要评估其合理性,因为创建索引也是要磁盘空间,维护起来也是需要代价的 创建索引 hive> create index [index_studentid ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
随机推荐
- linux自动更新代码,自动备份数据库,打包应用发布
切换root用户 sudo su - 1.安装svn,mysql yum install subversion yum install mysql 2.安装 maven 下载:百度云盘地址为 http ...
- 牛客多校第二场 G transform
链接:https://www.nowcoder.com/acm/contest/140/G White Cloud placed n containers in sequence on a axes. ...
- 【腾讯开源】前端预处理器语言图形编译工具 Koala使用指南
摘要:Koala是一款预处理器语言图形编译工具,支持Less.Sass.CoffeeScript.Compass框架的即时编译.无需手动输入命令去编译,后台监听文件是否有改变,如有修改会自动进行编译, ...
- 去掉HTML标记 .
/// <summary> /// 去除HTML标记 /// </summary> /// <param name=" ...
- leetcode56:合并区间
给出一个区间的集合,请合并所有重叠的区间.(解题思想来源于:https://blog.csdn.net/qq_34364995/article/details/80788049 ) 示例 1: 输入: ...
- vue项目功能
vue-router { path: '/', name: 'home', // 路由的重定向 ...
- ArrayList方法综合练习
package com.zs.windows; import java.util.ArrayList; import java.util.Scanner; import com.zs.entity.G ...
- 【Python】socket编程-3
. SocketServer最简单的使用方法: () 创建一个Handler类,继承自BaseRequestHandler,重写其handle(),在该方法中完成对请求的处理. () 实例化一个Ser ...
- 2.28 查看webdriver API
2.28 查看webdriver API(带翻译) 前言 前面都是点点滴滴的介绍selenium的一些api使用方法,那么selenium的api到底有多少呢?本篇就教大家如何去查看seleni ...
- Android内核sys_setresuid() Patch提权(CVE-2012-6422)
让我们的Android ROOT,多一点套路. 一.简单套路 CVE-2012-6422的漏洞利用代码,展示了另一种提权方法.(见附录) 这也是一个mmap驱动接口校验导致映射任意内核地址的洞.将内核 ...