记录一次接口性能优化
查询接口性能优化
两个查询接口,涉及四个不同的表,其中有一个表数据量较大;
一开始编码实现的方法,调用接口发现耗时特别长,三四秒钟:
使用Spring StopWatch分析代码运行时间,找到是哪里导致整个接口时间需要这么久的:
StopWatch stopWatch = new StopWatch();
// 开始时间
stopWatch.start();
// 执行时间(1s)
Thread.sleep(1000);
// 结束时间
stopWatch.stop();
// 统计执行时间(秒)
System.out.printf("执行时长:%f 秒.%n", stopWatch.getTotalTimeSeconds()); // %n 为换行
// 统计执行时间(毫秒)
System.out.printf("执行时长:%d 毫秒.%n", stopWatch.getTotalTimeMillis());
// 统计执行时间(纳秒)
System.out.printf("执行时长:%d 纳秒.%n", stopWatch.getTotalTimeNanos());
先分析什么原因导致的,明显能感觉得到的是查询那个数据量大的表导致调用接口时间过长,检查代码执行逻辑,分析有一些foreach中的查询语句可以提取出来,放在循环外面只需要查询一次保存到内存中,后面使用直接从内存中拿这个值;
然后有一些查询可以进行联表查询,但sql语句改写成联表查询时间反而变长了,没来得及仔细研究是什么原因导致的,也可能是sql语句数据处理有问题;
把for循环中的所有涉及查询数据库的语句能提取出来就提取出来作为公共的,然后就是优化sql语句编写方式,最终将两个查询接口从查询一次需要三四秒甚至四五秒,到七八百、三四百毫秒。