首页 > 其他分享 >记录一次慢接口优化(一)

记录一次慢接口优化(一)

时间:2023-01-10 17:13:31浏览次数:41  
标签:记录 接口 索引 flag pad sql aid 优化 delete

前言:

  在最近的工作中,分到几个慢接口优化的任务,这里记录一下慢接口优化的过程

  系统方面:微服务系统

  响应时间:13S(秒)

优化过程:

  1. SkyWalking(链路追踪分析系统)

    使用:追踪-->端点名称:(所需要分析的接口名)-->时间范围:(选择时间) -->搜索

    说明:由于是微服务系统,业务的复杂性较高,所以我这边借用链路追踪工具来分析出这个接口中慢的原因(sql慢、第三方接口慢、feign接口慢....)

    发现:通过使用链路追踪分析工具,我发现是一个批量更新的sql很慢,有11秒多

    sql结果如下:  

update TableA
set delete_flag=1
where 
        (aid=? and pad=? and status=? delete_flag=0)
    or (aid=? and pad=? and status=? delete_flag=0)
    or (aid=? and pad=? and status=? delete_flag=0)
    or (aid=? and pad=? and status=? delete_flag=0)
    or (aid=? and pad=? and status=? delete_flag=0)
    or (aid=? and pad=? and status=? delete_flag=0)
    or (aid=? and pad=? and status=? delete_flag=0)
    ......

  2.确定sql慢

    首次分析:这种sql一般是纯手写sql,此时我们需要梳理代码,并找到此sql

    再次分析:再次分析代码,仔细分析sql的入参是什么,并联系上下文(尤其是上文)

    查看mapper.xml文件中的sql:(哇哦,delete标签中是update语句,能这样写吗?不用怀疑自己去查)

<delete  id="" parameteType ="java.util.List">
    update TableA
    set delete_flag=1
    where
        <foreach collection="list" item="item" separator="or" index="index">
        (aid=#{item.aid} and pad=#{item.pad} and status=#{item.sad} and delete_flag=0)
        </foreach>
</delete>

  3.分析此条sql结果和相关的代码逻辑

    sql发现:通过sql结果发现,OR拼接太多(这个是最直观的)。where条件有点多,这个几个字段是否添加了索引?

        通过 show index from TableName,查看这个表的索引情况,通过发现只有主键id字段有索引

    代码逻辑:使用了这样List<Map<String,Map>> list = new ArrayList<>(); 然后直接批量更新,通过观察这个map有很大可能是代表一个对象

  4.总结出现的问题

    根据上面的分析:没有使用索引,OR拼接太多,where条件太多,map代表一个对象

  5.优化思路

    方案一:能否再增加索引,来解决OR 和 where的问题?

      虽然增加索引能够增加匹配效率,但是此时条件中有4个字段,在加上主键字段,已经是5个。我们知道一般情况下一张表的索引是不超过5个的(也就是说最多5个)

      所以,此方案不合理

      不合理的地方:A:增加索引,虽然可以解决目前的更新效率,但是时间一长,数据量增大,问题依然存在。

             B:OR拼接太多的问题根本就没有解决

             C:一个问题增加到5个索引字段,若后续字段还需增加索引,根据规定,无法在增加索引字段,后续问题无法解决

    方案二:代码逻辑优化,试图利用主键进行批量更新

      A:根据原代码逻辑构建出条件,进行查询,主要是获取主键

      B:根据主键字段,进行批量更新

      所以,此方案合理

 

      

      

    

    

 

 

 

 

 

 

 

 

 

    

标签:记录,接口,索引,flag,pad,sql,aid,优化,delete
From: https://www.cnblogs.com/Life-QX/p/17039239.html

相关文章

  • 常用功能系列---【JWT生成Token实现接口登录认证方案思路】
    JWT生成Token实现接口登录认证方案思路方案一(双token实现无感刷新)在token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录,跳转至登录页面。但是如何实......
  • 神经网络同时优化两个模型的参数/加载两个模型的参数
    框架:Pytorch以Adam为例一.传参和优化1.传入/优化一个模型的参数:opt=torch.optim.Adam(model_1.parameters)2.同时传入/优化两个模型的参数:opt=torch.optim.Ada......
  • SAP restful 接口
    T-CODE:SICF路径:/default_host/sap/bc/rest 右键创建新的子元素登录数据可配、处理器清单为新建类(后续附代码)示例新建类:ZCL_FI4_GET_XXX1METHODif_http_e......
  • layui使用记录
    datatable中使用 radiotable.render({elem:'#table_2304'//指定原始表格元素选择器(推荐id选择器),height:500//容器高......
  • 记录--JS-SDK页面打开提示realAuthUrl错误
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助测试环境好好地功能,上了生产,莫名其妙报错,开始以为是没有设置Js安全接口域名,结果让相应人员一查,已经设置了......
  • 日常开发记录-js的Date对象中的toLocaleDateString()
    就是把Date对象的日期部分转换为字符串,并返回结果。代码示例:console.log(newDate())//2023-01-10T05:42:41.926Zconsole.log(newDate().toLocaleDateString())//......
  • 行车记录仪app开发需要有什么功能
    驾车出行非常重要的是安全,在自身保障安全驾驶的前提下,也需要预防他人的碰瓷行为。为此安装相应的行车记录仪是很有必要的,也是很关键的。但是传统行车记录仪会占用后视镜的......
  • 优化mybatis-plus批量新增(只对MySql生效Oracle不生效)
    因为mybatis-plus的批量新增是一条一条的耗费资源和慢所以进行批量优化  1.自定义Sql注入器MySqlInjector继承DefaultSqlInjectorpublicclassMySqlInjectorexten......
  • P2343 宝石管理系统 做题记录
    随机跳的。一眼带修第\(\text{k}\)大,平衡树/权值线段树/set随便搞就行。(set可能要双\(\log\),所以没写)很快啊,权值线段树就\(\text{A}\)了。直接跑到最优解第......
  • 统一接口响应协议和响应工具类封装
    统一业务状态码BizCodeEnum开发状态码定义约束,共6位数,前三位代表服务,后3位代表接口比如商品服务210,购物车是220、用户服务230,403代表权限/****@Description......