找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1034|回复: 2

MongoDB如何正确中断正在创建的索引详解

[复制链接]
已绑定手机
已实名认证

571

主题

-68

回帖

954

牛毛

游客

积分
1154
发表于 2020-12-27 15:26:40 | 显示全部楼层 |阅读模式

这篇文章主要给大家介绍了关于MongoDB如何正确中断正在创建的索引的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

我们在使用 MongoDB 的时候,会出现需要给一个已经存在的大集合的某个字段增加索引的情况。

索引分为前台索引和后台索引,对应到 pymongo 中创建索引的代码:

import pymongo
handler = pymongo.MongoClient().yourdb.yourcol
# 前台索引
handler.create_index(‘字段名‘)
# 后台索引
handler.create_index(‘字段名‘, background=True)

如果集合里面有很多数据,并且你使用的是前台索引,那么此时,创建索引会把这个集合锁起来,所有对这个集合的写入操作都会挂起。直到索引创建完成为止。如果使用的是后台索引,那么创建索引的过程不会影响数据写入。

但有时候,本来想创建后台索引,却忘记加 background=True参数。此时怎么办?因为大集合创建索引有时候可能需要好几个小时,挂起的写入数据会堆积在内存里面,把内存撑爆。

此时,千万不要重启 MongoDB,因为重启以后,之前没有完成的索引创建操作,依然会自动启动继续创建。

正确的做法是杀掉创建索引的进程。

此时,我们可以在 MongoDB Shell 或者 Robo 3T里面操作。

这里以 Robo 3T为例,首先打开对应的集合,如下图所示:

然后把命令栏里面的内容修改为:

1db.currentOp()

返回的内容如下图所示:

创建索引的进程,可以在参数里面看到类似于

1"lockType": "write"

这样的字字段。在它附近,可以找到一个字段叫做 opid。

然后在命令栏输入命令:

1db.killOp(opid)

杀掉进程。

然后重新创建后台索引即可。

到此这篇关于MongoDB如何正确中断正在创建的索引的文章就介绍到这了,更多相关MongoDB中断正在创建的索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!www.changshakz.com       


2

主题

-2

回帖

9

牛毛

初生牛犊

积分
9
发表于 2025-3-16 11:38:40 | 显示全部楼层 来自 美国
PyMongo 中的 createindex() 方法用于在 MongoDB 数据库中创建索引。下面是如何正确中断正在创建的索引的详细步骤:<br><br>1. 首先,导入所需的库并连接到 MongoDB 数据库。请确保使用正确的数据库和集合名称。<br><br>
  1. python<br>import pymongo<br><br>client = pymongo.MongoClient("mongodb://localhost:27***17/")<br>db = client["yourdb"]<br>yourcollection = db["yourcollection"]
复制代码
<br><br>2. 判断索引是否已经开始创建,通过检查索引的存在性来确定。在前端索引的情况下,你可以在创建索引的方法中提前设置一个条件,以便在中断时检查索引是否存在。在后端索引的情况下,你可以使用 MongoDB 的 info() 方法查询索引的状态。<br><br>
  1. python<br># 判断索引是否存在<br>if not yourcollection.indexexists("字段名"):<br>    # 开始创建索引<br>    handler = pymongo.MongoClient().yourdb.yourcol<br>    handler.createindex(‘字段名’, unique=True)<br>else:<br>    # 索引已经存在,中断创建<br>    # 可以实现需要的逻辑,例如发送电子邮件通知管理员,或者重新编写索引策略等
复制代码
<br><br>3. 对正在创建的索引中断的方法如下:<br><br>
  1. python<br># 中断中断索引创建<br>def interruptindexcreate():<br>    # 这里可以实现需要的逻辑,例如发送电子邮件通知管理员,或者重新编写索引策略等<br>    print("Index creation interrupted")
复制代码
<br><br>4. 在需要的地方调用 interruptindexcreate() 方法。这将在尝试创建索引时触发,允许你采取必要的措施。<br><br>
  1. python<br># 当索引创建开始时,中断索引创建<br>interruptindexcreate()<br><br># 创建索引<br>handler = pymongo.MongoClient().yourdb.yourcol<br>handler.createindex(‘字段名’, unique=True)
复制代码
<br><br>这个方法让你在 MongoDB 创建索引时进行适当的干预和管理。在前端索引的情况下,你可以确保索引策略正确且有效。在后端索引的情况下,你可以根据需要重新评估和调整索引策略。

0

主题

1

回帖

9

牛毛

初生牛犊

积分
10
发表于 2025-3-25 19:55:00 | 显示全部楼层 来自 浙江省绍兴市
,unique=True, sparse=True)<br><br># 后台索引<br>handler.createindex(‘字段名', sparse=True)<br><br>这里的参数:<br><br>- unique:是否为唯一索引<br>- sparse:是否为稀疏索引<br><br>如果稀疏索引是需要的,那么就需要增加 sparse=True。<br><br>如果已经创建的索引不再需要,我们可以通过 remove\index 方法重新定义或删除索引。<br><br>例如,我们之前创建了前台索引,现在不想用了,可以通过 remove\index 方法删除:<br><br>
  1. python<br>import pymongo<br><br># 连接到 MongoDB<br>handler = pymongo.MongoClient().yourdb.yourcol<br><br># 删除前台索引<br>handler.dropindex('字段名')
复制代码
<br><br>或者,如果已经创建了后台索引,又需要删除,可以这样做:<br><br>
  1. python<br>import pymongo<br><br># 连接到 MongoDB<br>handler = pymongo.MongoClient().yourdb.yourcol<br><br># 删除后台索引<br>handler.dropindex('字段名', sparse=True)
复制代码
<br><br>以上就是关于 MongoDB 正确中断正在创建的索引的详细介绍,希望对大家有所帮助。如果还有其他疑问,欢迎随时提问,我们会尽快为您解答。
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-27 12:33 , Processed in 0.149707 second(s), 44 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表