一次因mongo查询不存在字段引发的事故记录_MongoDB

来源:脚本之家  责任编辑:小易  

话说今天的一个小小的查询失误给了我比较深刻的教训,也让我对mongo有了更深刻的理解,下面我们来说说这个事情的原委:

我们经常使用阿里云子账号在DMS上查询线上数据库数据,今天也是平常的一次操作

集合:

XXXX_message<br>数据量约 600万

我执行了下面的mongo查询:

db.XXXX_message.find({"channel_id": "1000000009XXXX700XXXX"}).limit(20);

但是上述语句中的 "channel_id" 字段不存在,真实字段应该是channel(有索引),属于失误操作

在执行过程中,我发现查询时间很久,于是中断了查询又重试了两次,还是很久,最后中断了查询,我意识到我想查的字段可能错了,于是看了下集合索引,使用正确的字段检索得到结果

但就在这时候,一场事故也在悄然酝酿,2分钟后,阿里云监控中心打来告警电话,mongo数据库cpu、iops异常升高

起初并没有意识到是这个查询导致的,还以为是半小时前发布的版本可能有问题,于是立即回滚了版本并开始项目检查

查了许久,并没有查到可能造成本次数据库异常告警的原因,项目对该库的依赖的操作的地方非常少。

当我们苦苦想不到原因的时候,我们去查了下相关慢sql日志,果然一道耗时约1800000ms的慢sql日志引起了我们的注意

这时候我似乎意识到了点什么,我立马查阿里云控制台查询历史核对了我刚才查询的时间和数据库cpu、磁盘iops异常升高的时间节点

完全对上了,该起事故持续半小时左右,那条没有被成功中断的sql也执行了半小时左右

这让我很震惊,一次控制台查询居然导致整个数据库出现如此严重的问题,mongo底层没有考虑过不存在字段查询问题吗?

我慢慢平复心情,仔细回顾这件事情,我尝试着从mongo和mysql的底层去理解这个问题

mongo本身是集合型数据库,意味着每个集合文档都可以有自己独立的数据结构,和mysql等关系型数据库的很重要的区别就是它没有固定的表结构,它包容且随性

当在查询一个不存在的字段的时候,它仍然按照普通查询检索数据,这时候它会全表扫描,也就是说在上述失误语句中,mongo底层检索了整个集合的数据集,

遍历了该集合所有的磁盘块,这才导致磁盘iops升高且cpu升高。

这次经历让我觉得我有必要记录下相关心得,可能对于很多高级技术人员,这些东西都是很容易理解和规避的事情,但大多数人对此可能并没有深刻认识

这次事故让我对技术多了一层敬畏,这有助于我在今后的代码实践和操作中更加谨慎和多一层思考,希望大家以此为戒!此文共勉!

到此这篇关于一次因mongo查询不存在字段引发的事故记录的文章就介绍到这了,更多相关mongo查询不存在字段的事故内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!


  • 本文相关:
  • mongodb中如何使用join操作详解
  • mongodb教程之基本管理命令
  • mongodb最大连接数设置失效的异常分析过程与解决方法
  • mongodb分片键的选择和案例实例详解
  • mongodb数据更新方法干货篇
  • centos7 yum安装mongodb实现步骤详解
  • mongodb社区版和企业版的差别对照表
  • mongodb使用小结 一些常用操作分享
  • mongodb入门教程之索引操作浅析
  • mongodb中crud的深入讲解
  • mongodb查询中的null和存在不存在
  • 查询MongoDB数据库中某个集合的ID时,查出了一部分...
  • 查询mongoDB时参数中有中文导致查询不出结果,该怎...
  • mongodb $exists查询求解
  • 用PHP查询mongo数据时,条件是某个字段(A为数组)...
  • 如何按日期时间字段获取最新的MongoDB记录
  • MongoDB批量写入错误问题,怎么解决
  • mongodb数据库怎么查询出某一段时间内的数据?
  • mongodb数据库怎么查询出某一段时间内的数据
  • mongodb数据库批量插入海量数据时为什么有少部分数...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mongodb中如何使用join操作详解mongodb教程之基本管理命令mongodb最大连接数设置失效的异常分析过程与解决方法mongodb分片键的选择和案例实例详解mongodb数据更新方法干货篇centos7 yum安装mongodb实现步骤详解mongodb社区版和企业版的差别对照表mongodb使用小结 一些常用操作分享mongodb入门教程之索引操作浅析mongodb中crud的深入讲解mongodb常用操作命令大全mongodb各种查询操作详解mongodb数据库插入、更新和删除操mongodb 数据库操作--备份 还原 mongodb插入数据的3种方法mongodb中使用distinct去重的简单浅谈mysql和mariadb区别(mariadbmongodb整库备份与还原以及单个cmongodb查询操作限制返回字段的方mongodb 实现远程连接mongodb的查询方法mongodb快速入门笔记(三)之mongodb插入文mac中mongodb的安装与卸载步骤详解利用mongodb查询某坐标是否在规定多边形区mongodb 游标详解及实例代码使用aggregate在mongodb中查询重复数据记linux系统下mongodb的简单安装与基本操作mongodb磁盘io问题的3种解决方法mongodb日常使用的技巧与注意事项汇总mongodb 3.6版本中bind_ip设置详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved