首页 > 其他分享 >尊嘟假嘟?三行代码提升接口性能600倍

尊嘟假嘟?三行代码提升接口性能600倍

时间:2024-01-10 13:56:16浏览次数:32  
标签:code 600 假嘟 代码 接口 尊嘟 sql settlement order

一、背景

  业务在群里反馈编辑结算单时有些账单明细查不出来,但是新建结算单可以,我第一反应是去测试环境试试有没有该问题,结果发现没任何问题!!!
  然后我登录生产环境编辑业务反馈有问题的结算单,发现查询接口直接504网关超时了,此时心里已经猜到是代码性能问题导致的,接来下就把重点放到排查接口超时的问题上了。

二、问题排查

遇到生产问题先查日志是基本操作,登录阿里云的日志平台,可以查到接口耗时竟然高达469245毫秒

这个结算单关联的账单数量也就800多条,所以可以肯定这个接口存在性能问题。

image

但是日志除了接口耗时,并没有其他报错信息或异常信息,看不出哪里导致了接口慢。

接口慢一般是由如下几个原因导致:

  1. 依赖的外部系统慢,比如同步调用外部系统的接口耗时比较久
  2. 处理的数据过多导致
  3. sql性能有问题,存在慢sql
  4. 有大循环存在循环处理的逻辑,如循环读取exel并处理
  5. 网络问题或者依赖的中间件比较慢
  6. 如果使用了锁,也可能由于长时间获取不到锁导致接口超时

当然也可以使用arthas的trace命令分析哪一块比较耗时。

由于安装arthas有点麻烦,就先猜测可能慢sql导致的,然后就登录阿里云RDS查看了慢sql监控日志。
image
好家伙一看吓一跳,sql耗时竟然高达66秒,而且执行次数还挺多!

我赶紧把sql语句放到数据库用explain命令看下执行计划,分析这条sql为啥这么慢。

EXPLAIN SELECT DISTINCT(bill_code) FROM `t_bill_detail_2023_4` WHERE  
(settlement_order_code IS NULL OR settlement_order_code = 'JS23122600000001');

分析结果如下:

image

如果不知道explain结果每个字段的含义,可以看看这篇文章《长达1.7万字的explain关键字指南!》。

可以看到扫描行数达到了250多万行,ref已经是最高效的const,但是看最后的Extra列
Using temporary 表明这个sql用到了临时表,顿时心里清楚什么原因了。

因为sql有个去重关键字DISTINCT,所以mysql在需要建临时表来完成查询结果集的去重操作,如果结果集数据量比较小没有超过buffer,就可以直接在内存中去重,这种效率也是比较高的。

但是如果结果集数据量很大,buffer存不下,那就需要借助磁盘完成去重了,我们都知道操作磁盘相比内存是非常慢的,时间差几个数量级

虽然这个表里的settlement_order_code字段是有索引的,但是线上也有很多settlement_order_code为null的数据,这就导致查出来的结果集非常大,然后又用到临时表,所以sql耗时才这么久!

同时,这里也解释了为什么测试环境没有发现这个问题,因为测试环境的数据不多,直接在内存就完成去重了。

三、问题解决

知道了问题原因就很好解决了,首先根据SQL和接口地址很快就找到出现问题的代码是下图红框圈出来的地方

image

可以看到代码前面有个判断,只有当isThreeOrderQuery=true时才会执行这个查询,判断方法代码如下

image

然后因为这是个编辑场景,前端会把当前结算单号(usedSettlementOrderCode字段)传给后端,所以这个方法就返回了true。

同理,拼接出来的sql就带了条件(settlement_order_code IS NULL OR settlement_order_code = 'JS23122600000001')。

image

解决起来也很简单,把isThreeOrderQuery()方法圈出来的代码去掉就行了,这样就不会执行那个查询,同时也不会影响原有的代码逻辑,因为后面会根据筛选条件再查一次t_bill_detail表。

改代码发布后,再编辑结算单,优化后的效果如下图:

image

只改了三行代码,接口耗时就立马从469245ms缩短到700ms,性能提升了600多倍

四、总结

感觉压测环境还是有必要的,有些问题数据量小了或者请求并发不够都没法暴露出来,同时以后写代码可以提前把sql在数据库explain下看看性能如何,毕竟能跑就行不是我们的追求

标签:code,600,假嘟,代码,接口,尊嘟,sql,settlement,order
From: https://www.cnblogs.com/2YSP/p/17955463

相关文章

  • 基于TIC6000的DSP教学实验箱操作教程:5-18 RGB24图像灰度转换(LCD显示)
    一、实验目的学习RGB24图像灰度转换的原理,掌握图像的读取方法,并实现在LCD上显示灰度转换前后的图像。二、实验原理RGB24图像灰度转换RGB颜色空间作为一种常用的彩色图像表示模型,分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。一般情况下,RGB彩色图像灰度化有三种转化方案:(1)......
  • 疾速7600MT/s!KELVV科赋CRAS V RGB DDR5内存图赏
    12月18日消息,KLEVV科赋日前推出新款大容量DDR5内存套装,满足游戏玩家、内容创作者和高端PC爱好者的需求。现在,KLEVV科赋CRASVRGB内存套装已经来到我们评测室,下面为大家带来图赏。目前在售CRASVRGB均为16B*2套装,提供6000MT/s、6400MT/s、7200MT/s、7600MT/s、8000MT/s共五种不同......
  • 《安富莱嵌入式周报》第329期:圣诞前夕,各种软件井喷式更新,开源600Wh的UPS低压电源,各种
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 圣诞前夕,各种软件井喷式发布新版本视频版:https://www.bilibili.com/video/BV19Q4y1u7Es 1、开源600Wh的UPS低压电源https://pop.fsck.pl/projects/secondlife-ups-Mk......
  • 实验六_OOP_张文瑞_202213260018
    实验任务4Vector.hpp源代码1#include<iostream>2#include<stdexcept>34template<typenameT>5classVector{6private:7intsize;8T*vec;9public:10Vector<T>()=default;11......
  • SFP6006-ASEMI新能源功率器件SFP6006
    编辑:llSFP6006-ASEMI新能源功率器件SFP6006型号:SFP6006品牌:ASEMI封装:TO-247最大平均正向电流:60A最大重复峰值反向电压:600V产品引线数量:3产品内部芯片个数:2产品内部芯片尺寸:140MIL峰值正向漏电流:<10ua恢复时间:35ns浪涌电流:600A芯片材质:最大正向电压:0.98V~1.90V工作......
  • 尊嘟假嘟?2023年人工智能行业新诞生10家独角兽,AIGC竟占近一半
    今年的AIGC持续热了一年,从王慧文等大佬的入局,到百度发布「文心一言」,各大巨头纷纷发布大模型产品,切实地给中国人工智能赛道的融资添了一把浓烈的火。回顾这即将过去的一整年,虽然2023年投融资整体行业遇冷,各种坏消息不断,但总体而言,AI行业融资的形势相对仍处于比较热门的状态。2......
  • PCIe 4.0天花板级性能!致态Ti600 4TB固态硬盘上手
    沉寂已久的固态硬盘市场终于迎来了破局者,长江存储·致态在TiPlus7100固态硬盘一炮走红之后,继续对产品进行迭代,并在今年10月推出了Ti系列的首款产品——致态Ti600固态硬盘。致态Ti600固态硬盘拥有更高的性价比,针对不同玩家提供了500GB,1TB及2TB多个容量版本,同时在性能方面丝毫不含......
  • 1299元!一图看懂长江存储致态Ti600 4TB超大杯
    今天,长江存储旗下致态正式发布了Ti6004TB大容量版本的SSD,目前已在京东和天猫官方旗舰店开售,价格为1299元。致态Ti6004TB容量版本采用了基于长江存储晶栈Xtacking3.0架构的QLC原厂颗粒,支持PCIe4.0、NVMe2.0协议,顺序读速达到了7000MB/s,顺序写入速度为6000MB/s。而且在晶栈Xtack......
  • AMD 锐龙5 7500F VS. Intel 酷睿i5-14600K对比:整机价格相差2000 游戏性能基本持平
    一、前言:ITX主机是该选Intel还是AMD平台?时代在进步,随着机械硬盘逐渐淡出主流市场,再加上主板的集成度越来越高,ATX机箱早已不是刚需。相反,越来越多的人开支搭建自己喜欢的ITX平台,而一台高颜值的ITX主机放在书桌上,也是一道亮丽的风景线。当然,受限于散热能力,ITX主机需要合理的控制......
  • 6. loop_interval: 600 这个参数是干啥的
     在SaltStack中,loop_interval参数通常是指SaltMinion执行循环的间隔时间。SaltMinion通过执行循环来监视SaltMaster的命令,并执行相应的操作。具体来说,loop_interval参数定义了SaltMinion检查是否有新命令的时间间隔。默认情况下,这个值是60秒(1分钟),但你提到的值是......