MongoDB一个广为诟病的问题是,大量数据resotore时索引重建非常缓慢,实测5000万的集合如果有3个以上的索引需要恢复,几乎没法成功,而且resotore时如果选择创建索引也会存在索引不生效的问题,种种情况表明,MongoDB的一些默认设置存在明显不合理之处。

当然,深入理解后总会有办法解决这些问题,MongoDB发展到金,功能也是越来全面。

一、对于小数据量collection,可直接单命令行创建索引

类似如下操作:

db.getCollection('processDataObj').createIndex({ 'flowNo':1 }, {}, 'majority')

二、对于大数据量collection,需执行后台创建的方式

如下是最佳实践脚本:

echo "定义变量..."
COLLECT="processDataObjInit"
INDEX="'flowNo':1"
JSFILE=processDataObjInit_1.js echo "生成js文件..."
echo "print('createIndex ...');
print(db.${COLLECT}.createIndex({${INDEX}}, {}, 'majority'));
print('End time is:');
print(db.hello());" > ${JSFILE} echo "执行后台创建索引..."
JSFILE=processDataObjInit_1.js
KKLOG=${JSFILE}-`date +%Y-%m-%dT%H:%M`.log
mongosh mongodb://'admin':'passwd'@node1:20000,node2:20000,node3:20000/flowtest?authSource=admin --quiet ${JSFILE} > $KKLOG 2>&1 &

三、4600万collection重建索引计时情况

-rw-rw-r-- 1 mongod mongod         140 10月  8 15:32 processDataObjInit_1.js
-rw-rw-r-- 1 mongod mongod 707 10月 8 16:20 processDataObjInit_1.js-2023-10-08T15:32.log
-rw-rw-r-- 1 mongod mongod 184 10月 8 15:31 processDataObjInit_2.js
-rw-rw-r-- 1 mongod mongod 746 10月 8 16:20 processDataObjInit_2.js-2023-10-08T15:31.log
-rw-rw-r-- 1 mongod mongod 223 10月 8 15:28 processDataObjInit_3.js
-rw-rw-r-- 1 mongod mongod 782 10月 8 16:20 processDataObjInit_3.js-2023-10-08T15:28.log

可见基本需要50分钟左右即可并发完成3个索引的创建。

四、MongoDB默认只能同时并发创建3个索引

因此需修改配置到制定的大小,本次案例有6个大索引需要同时创建,修改shard配置文件,调整并发为6.

setParameter:
maxNumActiveUserIndexBuilds: 6

实际启动shard时可以看到,配置已生效:

{"t":{"$date":"2023-10-08T07:01:54.495Z"},"s":"I",  "c":"CONTROL",  "id":5760901, "ctx":"main","msg":"Applied --setParameter options","attr":{"serverParameters":{"connPoolMaxConnsPerHost":{"default":200,"value":20000},"maxNumActiveUserIndexBuilds":{"default":3,"value":6}}}}

【最佳实践】MongoDB导入数据时重建索引的更多相关文章

  1. 多表利用DIH批量导入数据并建立索引注意事项

    如果希望同时对多个表进行全文检索,那我们该如何处理呢?利用DIH导入数据并建立索引时.schema.xml中配置了uniqueKey为id <uniqueKey>id</unique ...

  2. SQL Server导入数据时“启用标示插入”详解

    在SQL Server中导入数据时,会有一个"启用标示插入"的选项,突然间懵逼了,这到底啥意思?我选与不选这个选项,结果好像没区别!不科学啊这,"存在即合理", ...

  3. [MySQL]load data local infile向MySQL数据库中导入数据时,无法导入和字段不分离问题。

    利用load data将文件中的数据导入数据库表中的时候,遇到了两个问题. 首先是load data命令无法执行的问题: 命令行下输入load data local infile "path ...

  4. SQLSERVER:大容量导入数据时保留标识值 (SQL Server)

    从MSDN上看到实现大容量导入数据时保留标识值得方法包含三种: MSDN链接地址为:https://msdn.microsoft.com/zh-cn/library/ms178129.aspx 感觉M ...

  5. 转 SSIS处理导入数据时, 存在的更新, 不存在的插入

    SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...

  6. MSSQL导入数据时,出现“无法截断表 因为表正由Foreign key引用”错误

    * 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] ”失败,错误如下:“无 ...

  7. 使用Sqoop从mysql向hdfs或者hive导入数据时出现的一些错误

    1.原表没有设置主键,出现错误提示: ERROR tool.ImportTool: Error during import: No primary key could be found for tab ...

  8. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  9. DB2导入数据时乱码问题

    1.由于导入import导入数据时乱码,一直找不到解决办法,于是就用load导入 LOAD后,发现某些表检查挂起( 原因码为 "1",所以不允许操作 SQLSTATE=57016  ...

  10. mongodb 更新数据时int32变为double的解决办法 & 教程

    https://www.runoob.com/mongodb/mongodb-mongodump-mongorestore.html mongodb 更新数据时int32变为double的解决办法   ...

随机推荐

  1. GGTalk 开源即时通讯系统源码剖析之:虚拟数据库

    继上篇<GGTalk 开源即时通讯系统源码剖析之:服务端全局缓存>详细介绍了 GGTalk 对需要频繁查询数据库的数据做了服务端全局缓存处理,以降低数据库的读取压力以及加快客户端请求的响应 ...

  2. Python 学习路线图

    Python 学习路线图 在这个系列笔记中,我将陆续整理自己在学习 Python 编程语言及其框架的过程中留下的笔记和代码,目的是掌握如何在生产环境中利用各种领域的第三方框架来快速开发应用程序.和大多 ...

  3. 好用的log4j.properties配置文件(按照级别打印日志,每天生成不同类型的日志,可以打印sql日志)

    日志按照级别分类 log4j.rootLogger = INFO,stdout,D,E,I #ShuChuDaoDaYingTai log4j.appender.stdout = org.apache ...

  4. Acunetix使用说明

    简述 Acunetix是一种应用安全性扫描工具,旨在帮助发现和修复Web应用程序中的漏洞和安全风险. Acunetix可以发现以下一些常见的安全问题: 跨站脚本攻击(XSS):通过在网页中注入恶意脚本 ...

  5. 使用Canal同步mysql数据到es

    一.简介 Canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7 ...

  6. 一个Web项目实现多个数据库存储数据并相互切换

    1.使用场景 多数据源使用场景一般为: 主从数据库切换 读写分离 兼容旧库 2.具体实现 实现原理 Spring2.x的版本中采用Proxy模式,就是在方案中实现一个虚拟的数据源,并且用它来封装数据源 ...

  7. vim玩法 .vimrc配置映射指令nnoremap、inoremap

    编辑 vimrc 文件, vi ~/.vimrc vim中的映射指令,用于将一个按键绑定到某一个操作上. map: 执行映射指令,执行时会进行递归替换,可能会出现"按键循环"的情况 ...

  8. 交换机:ToR、EoR

    参考链接: 交换机:ToR.EoR ToR:(Top of Rack)接入方式就是在服务器机柜的最上面安装接入交换机. EoR:(End of Row)接入交换机集中安装在一列机柜端部的机柜内,通过水 ...

  9. Linux 下的 OpenGL 之路(九):天空盒、反射和折射

    前言 搞定了天空盒,才算是真正完成了场景的搭建,以后再要进行什么样的图形学测试,都可以在这个场景下进行.比如后面的反射.折射就是这样的例子. 写完这篇,我决定暂时结束这个系列.主要是因为我太懒了,居然 ...

  10. Blazor前后端框架Known-V1.2.9

    V1.2.9 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...