最近项目的一个版本刚迭代上去,然后设备也陆续地接入到了系统中。
设备产生的数据经过解析、处理之后落到了 MongoDB 中,但是才 10w 的数据就导致分页查询非常慢,count 操作也是慢的感人。
上午加了索引之后,从 10 多秒降到了 5 秒左右,但是这个速度还是很慢啊,这 TM 的等到设备都接入进来不就炸了。
然后下午就开始排错,查看代码中的慢查询。
最后发现一个现象就是:通过 Navicat 去查询相同的 find 和 count 语句要比在代码中快了好多倍,客户端的查询才是正常现象。
我就纳闷了,客户端连接的数据库和项目代码中链接的数据库是一致的啊,为鸡毛一个快一个慢呢?
后来问了运维,原来这个买的阿里云的 MongoDB 实例用了可复制集,然后数据库是一主一背。
虽然项目代码中连接的数据库配置和 Navicat 客户端的一毛一样,但是项目代码里面查的是主库,而 Navicat 客户端查的是从库。
然后做了一个实验,把 Navicat 去连接主库,果然,尼玛速度一下就变慢了不少。
这 TM 的,真是坑爹。
不过还好的是,问题算是找到了,前进了一大步。
再来分析一下,连接到主库进行查询操作为啥这么慢呢?主库上我也建了索引啊!
初步分析是,读写操作都集中在了主库上,不光是分页查询的这种读操作,还有其他的不少读操作。而且主库的写操作不少;另外还有 5min 执行一次的定时任务,需要读的数据和写的数据都集中在了主库上。因此这里我分析,可能是主库上的资源争用比较厉害。这个留待后续继续分析。
既然主备都有,为啥不去读从库?
这个需要去了解一下 MongoDB 的可复制集的原理,以及 Spring Boot 是如何配置 MongoDB 读写分离的。
本来今天晚上是准备把主从读写分离配置完了在走的,奈何要赶火车就先放下了,查询慢就慢一点吧,至少没挂且知道原因在哪儿了!
各位晚安!