在系统测试时,缺少了压力测试,都是测试小数据量的操作,没有用大量的数据进行验证。系统上线后,将用户的数据拷贝到测试环境进行使用时,发现某个功能数据处理很慢,有两次处理还内存溢出了,后续任务根本无法进行。还好我们发现的早,用户还没用到那里,还可以及时的优化,不至于实际用的时候打脸。 数据处理慢的主要是一百多万的数据在多张表中进行处理,同时也涉及到了数据的校验,关联数据的查询等,这些都比较耗时。 经过代码分析和调查,发现了以下问题: 1.一百多万条的数据进行for循环,并且在单个for循环中进行数据的查询,导致大量的请求到数据库 2.数据库表没有加索引,导致关联查询很慢 3.在数据保存时,使用mybatis-plus的saveBatch方法设置的批次提交数量过大(默认为1000),在保存一百多万的数据时,有张履历表的insert操作竟然耗时2个多小时 优化方式如下: 1.数据获取到内存,减少数据库的请求 2.添加表索引,减少查询时间 3.调整批次提交的数据量,方法是:用用户数据多次模拟大批量的保存,以获取最佳的提交批量 4.调整mysql数据库的 bulk_insert_buffer_size 由8M提升到100M,提升批量保存的性能 结果:最终数据处理的时间成倍缩减,不用一次操作再等个一两个小时了。