背景:服务器cpu报警,5分钟内3次超过30%。当时,公司管理产品的同事正通过我们提供的程序对上传的数据做处理。
原本一分钟能处理10000条数据的,突然变成一分钟只能处理100左右。对每个数据操作时间进行排查发现,更新操作的时间是0.6s,从这个时间推算,差不多一分钟就只能处理100条左右。
但是之前为什么能处理那么多呢?原来今天刚运行的数据是修改数据的操作。然后发现修改所依据的字段不是主键,也没有加索引。马上对它建立索引,再次运行,发现增加到1000条,并没有到10000条级别。折腾了很久,发现是刚发现cpu过高时,给代码设置的usleep时间是0.1s,每跑完一条休息0.1s,自然是只能差不多1000条了。最后把这个去掉之后就又正常了。
更新时where语句中的条件字段一定要加索引,尤其是大批量的数据更新。本例中,没有将主键作为条件字段,这也是一个原因。