问题起因:
后台会员对账单导出sql使用不当导致内存溢出,服务崩溃
排查思路:
监控日志,发现导出的日志有一段日志前后的间隔时间相差20多s,于是定位到该段代码发现同事写的sql有问题,导致全表扫描了订单,一次性把订单表数200w的数据查询出来了,导致内存溢出的结果
select * from tb_order_order
<where>
1=1
<if test="list!=null and list.size>0">
and order_number in
<foreach collection="list" item="list" separator="," open="(" close=")">
#{list}
</foreach>
</if>
</where>
因为同事传入了一个空的list集合列表,导致where条件里的if条件不成立,最终查询sql为 select * from tb_order_order where 1=1 导致了全表扫描订单200w条数据。
解决方式:
对sql进行了优化,尽量减少这样使用sql,并且即使使用if的过滤条件情况下,也得设置一个默认条件查询,这样即使if的条件不成立的情况下也至少有一个默认的过滤条件,比如如果传入的列表集合为空的情况下,只默认查5条订单,这样就不至于导致全表扫描造成内存溢出的问题。