快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → MongoDB删数据---一个无聊的测试

MongoDB删数据---一个无聊的测试

时间:2022-09-19 20:26:04人气:作者:快盘下载我要评论

MongoDB删数据---一个无聊的测试

上周五的时候,线上的一个MongoDB集群需要删除部分数据,这个MongoDB集群本身是个分片集群,包含10个分片,架构如下:

MongoDB删数据---一个无聊的测试

集群的总体节点情况如下:

15个mongos

5个mongoc

10个分片,每个分片7副本

在这样的一个集群上,需要删除一个集合的部分数据,包含数据记录977w条,删除的条件是分片键。业务给出的待删除记录为:

db.test.find({pid:xxxxxxx})

其中,pid是集合的分片键。

分析:

因为是按照分片键进行删除,所以如果我们执行一条删除语句,理论上会将删除的请求分发到每个shard上,然后分别执行删除操作,最后汇总起来。

实际操作过程中,我们采用的删除语句如下:

db.test.remove({pid:xxxxxxx})

实际执行时间:977w满足条件的数据全部删除,总计不到2分钟。(这个时间具有参考意义,大家可以记录下)

延伸

这里,就出现了一个问题,在MongoDB中,常用的删除语句有2中,分别是deleteMany语法和remove语法,那么这两种语法,到底哪个更快一点,更高效呢?

我们先来分析这两个语法:

首先:db.collection.deleteMany()

这个语法的使用方法如下:

db.collection.deleteMany(
   <filter>,
   {
      writeConcern: <document>,
      collation: <document>
   }
)

其中:

filter写条件,如果删除所有文档,则写{}即可;

writeConcern、collation写具体的删除配置,也可以不写。

返回值:

返回一个文档,包含一个acknowledged 字段,如果在writeConcern条件下操作成功,则为true,如果操作失败,则为false;另外有一个deletedCount字段,包含删除的文档记录条数

再来看:db.collection.remove()

---------删除一条记录--------
db.collection.remove(
   <query>,
   <justOne>
)
----------删除多条记录------
db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)

相比deleteMany,remove方法多了个选项,有一个bool类型的justOne选项,如果设置为true,则只删除满足条件的一条文档。

deleteMany方法无法实现只删除一条文档,如果非要实现,请使用db.collection.deleteOne方法。

那么这两个语法,到底哪个高效呢?下面我简单做了个实验:

1、给test、test1两个集合分别插入20w条数据;

2、分别使用deleteMany和remove方法删除大于1000的记录,总计包含19w多;

3、记录操作开始时间和结束时间,对比整体的时间消耗。

得到的实验结果如下:

--------------remove方法测试------------
test1:PRIMARY> for (var i=1 ;i<=200000 ; i++){ db.test.insert({"number":i})}
WriteResult({ "nInserted" : 1 })

---开始时间
test1:PRIMARY> new Date()
ISODate("2021-11-02T06:29:09.995Z")

test1:PRIMARY> db.test.remove({'number':{$gt:1000}})
WriteResult({ "nRemoved" : 199000 })
---结束时间
test1:PRIMARY> new Date()
ISODate("2021-11-02T06:29:25.412Z")

remove总计时间:15.417s

--------------deleteMany方法测试------------
test1:PRIMARY> for (var i=1 ;i<=200000 ; i++){ db.test1.insert({"number":i})}
WriteResult({ "nInserted" : 1 })
---开始时间
test1:PRIMARY> new Date()
ISODate("2021-11-02T06:48:08.511Z")

test1:PRIMARY> db.test1.deleteMany({'number':{$gt:1000}})
{ "acknowledged" : true, "deletedCount" : 199000 }
---结束时间
test1:PRIMARY> new Date()
ISODate("2021-11-02T06:48:24.204Z")

deleteMany总计时间:15.693s

总体来看:

1、deleteMany和remove方法删除数据的效率差不多。

2、deleteMany语法执行完成之后,会告知执行是否失败,并告知记录条数;而remove方法执行之后,只给出记录条数。

3、deleteMany语法无法删除一个文档,而remove方法可以删除单个文档

相关文章

  • wordpress删除“功能”中的 RSS链接

    wordpress删除“功能”中的 RSS链接,本次操作以wordpress-3.6.1为例,其它版本,操作上,大同小异 打开“网站wp-includesdefault-widgets.php” 搜索如......
  • 一步步带你设计MySQL索引数据结构

    一步步带你设计MySQL索引数据结构,想想我们生活中的例子,比如新华字典,我们有一个目录,目录根据拼音排序,内容包含了汉字位于字典中具体的的页码。聪明的你肯定也想到了,我们也可以借鉴这种思想,建立一个MySQL的目录,叫做“索引”。...

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。