记录一次后端接口性能优化操作

记录一次后端接口性能优化操作

线上查询卡券接口,列表挺快,点击详情,加载完成后竟然需要三秒,而且里面就只有三条数据,感觉到很是惊讶,着手开始分析

1.mysql的慢sql优化

已经定位到慢sql了,线上explain了一下,如下图,很显然a表全表扫描了21万条数据,没有走任何索引,还有j表和z表也是全表扫描。
看了下,e表是个单独的表,给相应字段加上索引后就好了,但是j表和z表是个临时表,是group by 然后查询出来的,如下图所示,z表之所以全表扫描,是因为它先group
by之后然后再去left链接,确实是把整个表查询了一遍,我们应该根据业务参数把z表减少然后再去左链接,所以我们应该加个条件过滤cooc.xxxxxid=#{xxxxid},xxxxid为业务参数,同样j表也是group by 语句,我们也要给他加个条件过滤,才能走索引,缩小范围然后再去left连接,查询会变快
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

java代码优化

sql查询出来的数据,会有多条数据,后去格式化了,这个格式化是并行的,我把他做成了异步并行就快多了。
List<xx> parallelStreamList = resultList.parallelStream().map(bean -> {
                xx cardbean = new xx();
                transferToXXXX(bean, cardbean, status);
                return cardbean;
            }).collect(Collectors.toList());

看日志可以知道parallelStream使用的如下线程组
ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-4

因为用了并发后,查询出来的集合已经不是有序的了,需要重新排下序:

cardgameBeanList = parallelStreamList.stream().sorted(Comparator.comparing(Bean::getOrderbydate,Comparator.reverseOrder()).thenComparing(Bean::getOrderbystatus).thenComparing(Bean::getId,Comparator.reverseOrder())).collect(Collectors.toList());

排序这里要注意一下,Comparator.reverseOrder() 不能写成 Comparator.comparing(类::属性一).reversed()。否则会有问题,因为List.stream().sorted(Comparator.comparing(类::属性一).reversed()); 是先以属性一升序,然后对结果集进行属性一降序,而List.stream().sorted(Comparator.comparing(类::属性一, Comparator.reverseOrder())); 是以属性一降序。

总结

优化完之后,接口反应时间从3秒变到0.2秒以下,后面查询出来得数据放缓存就更快了,
还得继续努力!!!

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写Java后端接口设计文档是为了确保接口的设计和实现符合预期的需求,同时方便团队成员共同合作开发。以下是编写Java后端接口设计文档的一般步骤和内容: 1. 引言:介绍文档的目的和范围,描述接口设计的背景和重要性。 2. 需求分析:列出接口的功能需求和业务需求,明确接口需要实现的具体功能和效果。 3. 接口概述:对接口进行总体概述,包括接口的名称、版本号、作者、创建日期等基本信息。 4. 接口设计原则:阐述接口设计的原则和准则,例如高内聚、低耦合、易于扩展等。 5. 接口列表:列出所有接口的名称、URL路径、请求方法(GET、POST等)、参数和返回值的数据类型等详细信息。 6. 请求参数:对每个接口的请求参数进行详细描述,包括参数名称、类型、是否必选、默认值、说明等。 7. 返回结果:定义每个接口的返回结果,包括数据结构和字段含义,可以使用JSON示例来演示返回结果的格式。 8. 错误码及异常处理:定义可能出现的错误码和异常情况,包括错误码的含义和建议的处理方式。 9. 接口调用示例:给出几个常用接口的请求示例,包括接口的URL、请求方法、请求参数和返回结果等。 10. 接口安全:描述接口的安全措施,如权限验证、数据加密等。 11. 接口性能优化:提供接口性能优化建议,如缓存使用、并发处理等。 12. 接口变更记录记录接口的变更历史,包括版本号、变更内容和修改时间等。 13. 参考资料:列出参考的文档或网址,方便后续查询和开发者理解文档中的相关知识。 14. 附录:补充一些必要的辅助信息,如术语解释、约定规范等。 编写Java后端接口设计文档需要考虑文档的清晰性、完整性和易读性。接口设计文档应该与接口代码同步更新,随着项目的演化和需求的变化,及时进行维护和更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值