开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2340人左右 1 + 2 + 3 + 4 +5 + 6 + 7)(1 2 3 4 5 群均已爆满,请不要在问有没有位置谢谢)
(文章最后有MongoDB 8.0 新功能发布会的时间和宣传页,可在线观看)
MongoDB 运行中在没有任何变动业务和访问量的情况下,系统突发的故障如IOPS升高的情况,在我们系统运行的过程中发生了这样的问题,这里就记录一下故障的发生和解决故障的整体的情况。
故障的版本是MongoDB 4.2.13,其中有一个collection,37G大小,说大不大,说小不小,其中这个表中有聚合的查询,我们在使用中已经进行了优化先对可以过滤掉的数据进行match后,在进行聚合,虽然速度不快,但也可以接受基本在500ms之内。
但此次导致IOPS 升高的语句并不是这个,而是一个普通的查询语句
{"op":"query","ns":"wuce.P_IN","command":{"find":"P_IN","filter":{"mc":312168,"isdo":0,"invosta":0,"inve":{"$gte":{"$date":"2024-07-10T00:00:00.000+0800"}}},"$db":"ice","$clusterTime":{"clusterTime":{"$timestamp":{"t":1722304726,"i":5}},"signature":{"hash":{"$binary":"4pflEud2+pykfWQq206k6iEF++w=","$type":"00"},"keyId":{"$numberLong":"7338309997287178243"}}},"lsid":{"id":{"$binary":"e0+tCitWT+GndKXFGzpz9A==","$type":"04"}},"$readPreference":{"mode":"primaryPreferred"}},"cursorid":{"$numberLong":"7403234999028736853"},"keysExamined":3484,"keysExaminedBySizeInBytes":87100,"docsExamined":3484,"docsExaminedBySizeInBytes":3894571,"numYield":36,"nreturned":101,"queryHash":"1BAEAE7B","planCacheKey":"67ED178C","locks":{"ReplicationStateTransition":{"ant":{"w":{"$numberLong":"38"}}},"Global":{"acquit":{"r":{"$numberLong":"38"}}},"Database":{"nt":{"r":{"$numberLong":"37"}}},"Collection":{"acquireCount":{"r":{"$numberLong":"37"}}},"Mutex":{"acquireCount":{"r":{"$numberLong":"1"}}}},"flowControl":{},"storage":{"data":{"bytesRead":{"$numberLong":"81574572"},"timeReadingMicros":{"$numberLong":"968849"}}},"responseLength":114228,"protocol":"op_msg","millis":999,"planSummary":"IXSCAN { mcid: 1, invte: 1, bupe: 1, iswn: 1 }","replRole":{"stateStr":"PRIMARY","_id":0}}
{"op":"query","ns":"wuce.P_IN","command":{"find":"P_IN","filter":{"mc":312168,"isdo":0,"invosta":0,"inve":{"$gte":{"$date":"2024-07-10T00:00:00.000+0800"}}},"$db":"ice","$clusterTime":{"clusterTime":{"$timestamp":{"t":1722304726,"i":5}},"signature":{"hash":{"$binary":"4pflEud2+pykfWQq206k6iEF++w=","$type":"00"},"keyId":{"$numberLong":"7338309997287178243"}}},"lsid":{"id":{"$binary":"e0+tCitWT+GndKXFGzpz9A==","$type":"04"}},"$readPreference":{"mode":"primaryPreferred"}},"cursorid":{"$numberLong":"7403234999028736853"},"keysExamined":3484,"keysExaminedBySizeInBytes":87100,"docsExamined":3484,"docsExaminedBySizeInBytes":3894571,"numYield":36,"nreturned":101,"queryHash":"1BAEAE7B","planCacheKey":"67ED178C","locks":{"ReplicationStateTransition":{"ant":{"w":{"$numberLong":"38"}}},"Global":{"acquit":{"r":{"$numberLong":"38"}}},"Database":{"nt":{"r":{"$numberLong":"37"}}},"Collection":{"acquireCount":{"r":{"$numberLong":"37"}}},"Mutex":{"acquireCount":{"r":{"$numberLong":"1"}}}},"flowControl":{},"storage":{"data":{"bytesRead":{"$numberLong":"81574572"},"timeReadingMicros":{"$numberLong":"968849"}}},"responseLength":114228,"protocol":"op_msg","millis":999,"planSummary":"IXSCAN { mcid: 1, invte: 1, bupe: 1, iswn: 1 }","replRole":{"stateStr":"PRIMARY","_id":0}}
这里将关键的信息都修改了,信息仅作为展示使用,可以从语句分析的信息中看到运行的时间已经到达了 999 毫秒,这已经属于MongoDB的慢查询了,从语句中分析语句中已经走了索引。但是MongoDB 给我们更多的信息,这相比传统数据库要好的多,我们看一下下面的分析
keysExamined: 3484:这个字段表示查询过程中 MongoDB 检查了 3484 个索引键。
keysExaminedBySizeInBytes: 87100:这个字段表示 MongoDB 在检查索引键时处理的总字节数为 87100 字节。
docsExamined: 3484:这个字段表示 MongoDB 在查询过程中检查了 3484 个文档。通常,keysExamined 和 docsExamined 数值相同,表示 MongoDB 需要对每个索引键对应的文档进行检查。
docsExaminedBySizeInBytes: 3894571:这个字段表示 MongoDB 在检查文档时处理的总字节数为 3894571 字节。
numYield: 36:这个字段表示查询过程中,MongoDB 让出(yield)了 36 次 CPU 控制权,以便处理其他操作。让出 CPU 控制权通常是在长时间运行的查询中为了避免锁定数据库而执行的操作。
nreturned: 101:这个字段表示查询返回了 101 个结果文档。
这里我们分析一下上述的信息,查询返回了101个结果,numYield 36次,并且和上面相比如果高频的每次都要在非常少的数据量查找要用到 3.7MB的数据中查找几个KB的数据,那么的确这个查询要不从逻辑上,要不从查询上要进行优化了。
但架构和开发反馈,之前一直没有对这个部分动过什么,突发性的就慢了。后面我们经过分析,发现其中有一个时间字段在索引里面并不存在但是现在查询在索引里面没有这个字段。
经过了解,之前加字段的时候,也尝试过但发现添加时间字段到索引后,查询的速度并没有特别大的变化,可能是当时的数据量小,但现在表大了,并且数据量堆积的厉害,这边我们就建议添加索引加上这个时间的字段,来看是否解决当前的问题。
在添加了的索引后,再次运行语句,我们从其中摘取执行的时间,1毫秒,优化完毕,参见下面的图中最后截取的执行语句的时间信息。
结论:在MongoDB运行中,随着时间的推移和数据量的加大,有些以前可以完美运行的索引可能在数据量达到一定情况下,失去索引应有的作用。
置顶文章:
专访唐建法-从MongoDB中国第一人到TapData掌门人的故事
MySQL 8.0x 到 9.0均可能崩溃--云厂商开发指责 MYSQL不测试就推新版本?
MongoDB 入门教学贴 从术语到操作 (用户权限 内部培训贴)
MongoDB 入门教学贴 单机的安装与设置 (内部培训贴)
MongoDB 谨献给说MongoDB 这不好那不好的“古董” -- 发展与演进,从3 到 7 的卓越变化
往期热门文章:
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PolarDB Serverless POC测试中有没有坑与发现的疑问
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL 有意思吗?有意思呀
PolarDB Serverless POC测试中有没有坑与发现的疑问
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话
MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴
临时工说:DBA 是不是阻碍国产数据库发展的毒瘤 ,是不是?从国产DB老专家的一条留言开始 (其实更好看的是文章下方的留言)
感谢 老虎刘 刘老师 对 5月20日 SQL 问题纠正贴 ---PostgreSQL 同一种SQL为什么这样写会提升45%性能
PostgreSQL 同一种SQL为什么这样写会提升45%性能 --程序员和DBA思维方式不同决定
PostgreSQL 熊灿灿一句话够学半个月 之 KILL -9
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一 (阿里云组团PK笔者实录)
临时工访谈:金牌 “女” 销售从ORACLE 转到另类国产数据库 到底 为什么?
临时工访谈:无名氏意外到访-- 也祝你好运(管理者PUA DBA现场直播)
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理
PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑
临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
PolarDB for PostgreSQL 有意思吗?有意思呀
PostgreSQL 玩PG我们是认真的,vacuum 稳定性平台我们有了
临时工说:裁员裁到 DBA 咋办 临时工教你 套路1 2 3
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
MONGODB ---- Austindatabases 历年文章合集
MYSQL --Austindatabases 历年文章合集
POSTGRESQL --Austindatabaes 历年文章整理
POLARDB -- Ausitndatabases 历年的文章集合
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗
MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 会丢数据吗?在次补刀MongoDB 双机热备
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
PostgreSQL 字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)
Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。
截止今天共发布 1196篇文字