摘要:
一个接口从开始开发到测试再到上线,相应速度都很快,但是过了两三个月,发现这个接口响应速度捉急啊,达到了4.5s左右,给用户的感觉像是出bug了,就会使劲儿点击,结果导致了点击量是PV的4倍,真是个不好的体验啊(题外话),着手排查问题。
过程
第一步当然是查询log日志了,找到对应的接口,看到执行的几条sql语句都挺正常的,因为当时测试已经通过,于是通过测量整个接口函数执行时间,发现这个函数确实从开始到结束总共执行了4.5秒左右,然后返回去看日志中的几条sql语句,分别到数据库中执行,发现其中起一条查询语句执行的时间是4.2s左右,总共时间4.5s,这一条语句就是4.2s,问题就在这里,再回到代码中,找到执行该语句的函数,原来是sequelize框model提供的方法findAndCountAll(顾名思义查询所有用户并且统计总数),当数据库中存储的量小时,不会有啥问题,但是当数据量庞大,这时再去遍历所有数据就会花费许多时间,随着数量增大,时间也会增长。
解决方法
要么直接执行统计总数的sql语句(比如:select count(*) from user where sp='test'),要么将findAndCountAll替换成count,即可解决问题,重新构建项目,访问该接口,响应时间明显短了数倍。
网友评论