从20s优化到500ms,我用了这三招

从标准到实战:详解IEC 61000-4-2下的ESD电路防护设计 本文深入解析IEC 61000-4-2标准下的ESD电路防护设计,从静电防护的基础原理到实战应用。详细介绍了接触放电与空气放电的区别、防护器件选型要点(如TVS管和压敏电阻)以及PCB布局的黄金法则,帮助工程师有效提升电子产品的抗静电能力,确保设备在严苛环境下的稳定运行。 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:苏三说技术

436e8f456ef500285f05167af73a193e.jpeg


接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。

本文将会接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。

前言

上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。

总体来说,用三招就搞定了。

到底经历了什么?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

1. 案发现场

我们每天早上上班前,都会收到一封线上慢查询接口汇总邮件,邮件中会展示接口地址、调用次数、最大耗时、平均耗时和traceId等信息。

我看到其中有一个批量评分查询接口,最大耗时达到了20s,平均耗时也有2s。

用skywalking查看该接口的调用信息,发现绝大数情况下,该接口响应还是比较快的,大部分情况都是500ms左右就能返回,但也有少部分超过了20s的请求。

这个现象就非常奇怪了。

莫非跟数据有关?

比如:要查某一个组织的数据,是非常快的。但如果要查平台,即组织的根节点,这种情况下,需要查询的数据量非常大,接口响应就可能会非常慢。

但事实证明不是这个原因。

很快有个同事给出了答案。

他们在结算单列表页面中,批量请求了这个接口,但他传参的数据量非常大。

怎么回事呢?

当初说的需求是这个接口给分页的列表页面调用,每页大小有:10、20、30、50、100,用户可以选择。

换句话说,调用批量评价查询接口,一次性最多可以查询100条记录。

但实际情况是:结算单列表页面还包含了很多订单。基本上每一个结算单,都有多个订单。调用批量评价查询接口时,需要把结算单和订单的数据合并到一起。

这样导致的结果是:调用批量评价查询接口时,一次性传入的参数非常多,入参list中包含几百、甚至几千条数据都有可能。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

2. 现状

如果一次性传入几百或者几千个id,批量查询数据还好,可以走主键索引,查询效率也不至于太差。

但那个批量评分查询接口,逻辑不简单。

伪代码如下:

public List<ScoreEntity> query(List<SearchEntity> list) {
    //结果
    List<ScoreEntity> result = Lists.newArrayList();
    //获取组织id
    List<Long> orgIds = list.stream().map(SearchEntity::getOrgId).collect(Collectors.toList());
    //通过regin调用远程接口获取组织信息
    List<OrgEntity> orgList = feginClient.getOrgByIds(orgIds);
    
    for(SearchEntity entity : list) {
        //通过组织id找组织code
        String orgCode = findOrgCode(orgList, entity.getOrgId());
    
        //通过组合条件查询评价
        ScoreSearchEntity scoreSearchEntity = new ScoreSearchEntity();
        scoreSearchEntity.setOrgCode(orgCode);
        scoreSearchEntity.setCategoryId(entity.getCategoryId());
        scoreSearchEntity.setBusinessId(entity.getBusinessId());
        scoreSearchEntity.setBusinessType(entity.getBusinessType());
        List<ScoreEntity> resultList = scoreMapper.queryScore(scoreSearchEntity);
        
        if(CollectionUtils.isNotEmpty(resultList)) {
            ScoreEntity scoreEntity = resultList.get(0);
            result.add(scoreEntity);
        }
    }
    return result;
}

其实在真实场景中,代码比这个复杂很多,这里为了给大家演示,简化了一下。

最关键的地方有两点:

  1. 在接口中远程调用了另外一个接口

  2. 需要在for循环中查询数据

其中的第1点,即:在接口中远程调用了另外一个接口,这个代码是必须的。

因为如果在评价表中冗余一个组织code字段,万一哪天组织表中的组织code有修改,不得不通过某种机制,通知我们同步修改评价表的组织code,不然就会出现数据不一致的问题。

很显然,如果要这样调整的话,业务流程上要改了,代码改动有点大。

所以,还是先保持在接口中远程调用吧。

这样看来,可以优化的地方只能在:for循环中查询数据。

3. 第一次优化

由于需要在for循环中,每条记录都要根据不同的条件,查询出想要的数据。

由于业务系统调用这个接口时,没有传id,不好在where条件中用id in (...),这方式批量查询数据。

其实,有一种办法不用循环查询,一条sql就能搞定需求:使用or关键字拼接,例如:(org_code='001' and category_id=123 and business_id=111 and business_type=1) or (org_code='002' and category_id=123 and business_id=112 and business_type=2) or (org_code='003' and category_id=124 and business_id=117 and business_type=1)...

这种方式会导致sql语句会非常长,性能也会很差。

其实还有一种写法:

where (a,b) in ((1,2),(1,3)...)

不过这种sql,如果一次性查询的数据量太多的话,性能也不太好。

居然没法改成批量查询,就只能优化单条查询sql的执行效率了。

首先从索引入手,因为改造成本最低。

第一次优化是优化索引。

评价表之前建立一个business_id字段的普通索引,但是从目前来看效率不太理想。

由于我果断加了联合索引:

alter table user_score add index  `un_org_category_business` (`org_code`,`category_id`,`business_id`,`business_type`) USING BTREE;

该联合索引由:org_code、category_id、business_id和business_type四个字段组成。

经过这次优化,效果立竿见影。

批量评价查询接口最大耗时,从最初的20s,缩短到了5s左右。

4. 第二次优化

由于需要在for循环中,每条记录都要根据不同的条件,查询出想要的数据。

只在一个线程中查询数据,显然太慢。

那么,为何不能改成多线程调用?

第二次优化,查询数据库由单线程改成多线程。

但由于该接口是要将查询出的所有数据,都返回回去的,所以要获取查询结果。

使用多线程调用,并且要获取返回值,这种场景使用java8中的CompleteFuture非常合适。

代码调整为:

CompletableFuture[] futureArray = dataList.stream()
     .map(data -> CompletableFuture
          .supplyAsync(() -> query(data), asyncExecutor)
          .whenComplete((result, th) -> {
       })).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futureArray).join();

CompleteFuture的本质是创建线程执行,为了避免产生太多的线程,所以使用线程池是非常有必要的。

优先推荐使用ThreadPoolExecutor类,我们自定义线程池。

具体代码如下:

ExecutorService threadPool = new ThreadPoolExecutor(
    8, //corePoolSize线程池中核心线程数
    10, //maximumPoolSize 线程池中最大线程数
    60, //线程池中线程的最大空闲时间,超过这个时间空闲线程将被回收
    TimeUnit.SECONDS,//时间单位
    new ArrayBlockingQueue(500), //队列
    new ThreadPoolExecutor.CallerRunsPolicy()); //拒绝策略

也可以使用ThreadPoolTaskExecutor类创建线程池:

@Configuration
public class ThreadPoolConfig {

    /**
     * 核心线程数量,默认1
     */
    private int corePoolSize = 8;

    /**
     * 最大线程数量,默认Integer.MAX_VALUE;
     */
    private int maxPoolSize = 10;

    /**
     * 空闲线程存活时间
     */
    private int keepAliveSeconds = 60;

    /**
     * 线程阻塞队列容量,默认Integer.MAX_VALUE
     */
    private int queueCapacity = 1;

    /**
     * 是否允许核心线程超时
     */
    private boolean allowCoreThreadTimeOut = false;


    @Bean("asyncExecutor")
    public Executor asyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        executor.setAllowCoreThreadTimeOut(allowCoreThreadTimeOut);
        // 设置拒绝策略,直接在execute方法的调用线程中运行被拒绝的任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 执行初始化
        executor.initialize();
        return executor;
    }
}

经过这次优化,接口性能也提升了5倍。

从5s左右,缩短到1s左右。

但整体效果还不太理想。

5. 第三次优化

经过前面的两次优化,批量查询评价接口性能有一些提升,但耗时还是大于1s。

出现这个问题的根本原因是:一次性查询的数据太多。

那么,我们为什么不限制一下,每次查询的记录条数呢?

第三次优化,限制一次性查询的记录条数。其实之前也做了限制,不过最大是2000条记录,从目前看效果不好。

限制该接口一次只能查200条记录,如果超过200条则会报错提示。

如果直接对该接口做限制,则可能会导致业务系统出现异常。

为了避免这种情况的发生,必须跟业务系统团队一起讨论一下优化方案。

主要有下面两个方案:

5.1 前端做分页

在结算单列表页中,每个结算单默认只展示1个订单,多余的分页查询。

这样的话,如果按照每页最大100条记录计算的话,结算单和订单最多一次只能查询200条记录。

这就需要业务系统的前端做分页功能,同时后端接口要调整支持分页查询。

但目前现状是前端没有多余开发资源。

由于人手不足的原因,这套方案目前只能暂时搁置。

5.2 分批调用接口

业务系统后端之前是一次性调用评价查询接口,现在改成分批调用。

比如:之前查询500条记录,业务系统只调用一次查询接口。

现在改成业务系统每次只查100条记录,分5批调用,总共也是查询500条记录。

这样不是变慢了吗?

答:如果那5批调用评价查询接口的操作,是在for循环中单线程顺序的,整体耗时当然可能会变慢。

但业务系统也可以改成多线程调用,只需最终汇总结果即可。

此时,有人可能会问题:在评价查询接口的服务器多线程调用,跟在其他业务系统中多线程调用不是一回事?

还不如把批量评价查询接口的服务器中,线程池的最大线程数调大一点?

显然你忽略了一件事:线上应用一般不会被部署成单点。绝大多数情况下,为了避免因为服务器挂了,造成单点故障,基本会部署至少2个节点。这样即使一个节点挂了,整个应用也能正常访问。

当然也可能会出现这种情况:假如挂了一个节点,另外一个节点可能因为访问的流量太大了,扛不住压力,也可能因此挂掉。

换句话说,通过业务系统中的多线程调用接口,可以将访问接口的流量负载均衡到不同的节点上。

他们也用8个线程,将数据分批,每批100条记录,最后将结果汇总。

经过这次优化,接口性能再次提升了1倍。

从1s左右,缩短到小于500ms。

温馨提醒一下,无论是在批量查询评价接口查询数据库,还是在业务系统中调用批量查询评价接口,使用多线程调用,都只是一个临时方案,并不完美。

这样做的原因主要是为了先快速解决问题,因为这种方案改动是最小的。

要从根本上解决问题,需要重新设计这一套功能,需要修改表结构,甚至可能需要修改业务流程。但由于牵涉到多条业务线,多个业务系统,只能排期慢慢做了。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

766a4a38eb193bd89ae63c06a6607f8e.png

已在知识星球更新源码解析如下:

5013cdcb93f82cac539751097ac81aef.jpeg

b8ccb1dd6d2b1f3deee115c4a3fd71b4.jpeg

992a8dc4b80aac33546f86d05496ccac.jpeg

5277e94d4373186d9a383b286a4e5652.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
人工智能——框架表示法 1975年美国明斯基在“A framework for representing knowledge”提出了框架理论。 1. 框架及框架的一般表示形式 框架:一种描述对象属性的数据结构。 框架的一般表示形式 <框架名> 槽名1: 侧面名1:值1,值2…,值p1 侧面名2:值1,值2…,值p2 侧面名2:值1,值2…,值pm1 槽名2: 侧面名... 阅读详情

相关推荐

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

从5秒优化到1秒,系统飞起来了...

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT ...

芋艿V 261

解决eNSP安装WinPcap版本冲突的完整指南

网络数据包捕获工具WinPcap是网络仿真环境的基础组件,其版本兼容性直接影响eNSP等网络模拟器的正常运行。当系统已安装新版WinPcap时,eNSP内置的旧版安装程序会因版本校验机制触发报错。通过彻底卸载现有驱动、安装特定版本WinPcap 4.1.2,并验证注册表和服务状态,可解决版本冲突问题。对于需要同时使用新版驱动的场景,可采用虚拟机隔离或Npcap兼容模式。该方案适用于Windows 10/11系统环境,涉及驱动签名、虚拟网卡等典型网络工程问题。

weixin_32612263的博客 339

springboot:实现异步响应请求(解决前端请求超时的问题)

问题 实际场景中会遇到请求业务处理流程耗时较长,比如长查询,远程调用等,主线程会被一直占用会影响其他请求的响应,导致服务端性能下降。同时,前端向服务器发送请求后等待响应的超时时间比较短(一般20s或30s),而实际执行可能超过1分钟。以下需要解决此问题。 解决方案 解决的方案分为以下两步骤 1.服务端异步处理 你需要将请求接口进行一些简单的改进。将返回值类型变更为Callable<T>类型,其中T可以为任意类型比如你原有的自定义返回类型。以下的new Callable方法,会新建一个线

奋斗鱼 1万+

腾讯面试——机器学习岗面试总结

先写合并两个有序数组,接着写合并n个有序的数组,假设总共m个数,讲了一个思路两两合并直到只剩下一个数组,分析一下时间复杂度(MlogN),面试官不满意,然后想了一下说了另一个思路,用n个指针开始指向各个数组的首端,用一个优先队列维护他们的最小值,每次拿出最小值的指针然后插入该指针的下一个值。感觉跟二面面试官聊得还是挺开心的,他详细地介绍了他们部门所做的业务,然后问了一下什么时候能来实现,我说只能暑假七八两个月,他觉得有点晚,这样子不利于转正,有些人都实习半年的,回去讨论一下,正式批之前给我答复。

FPGA/MATLAB学习教程/源码/项目合作开发 1234

Python 爬虫实战:在房天下抓取房产信息,分析房价走势

通过本次 Python 爬虫实战,我们成功地从房天下爬取了房产信息,并进行了存储、处理、分析和可视化展示。在这个过程中,我们不仅掌握了爬虫技术的基本应用,还学会了如何对动态加载的数据进行处理和分析。然而,本次爬虫任务也存在一些局限性,例如仅爬取了部分区域的房产数据,且未对房产的图片和视频内容进行分析。在未来的工作中,我们可以进一步优化爬虫程序,爬取更多区域的房产数据,并深入分析房产的多媒体内容、用户行为模式等,为购房者和房地产从业者提供更有价值的数据支持。

u014481728的博客 1372

三招从 20s 优化到 500ms

接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。本文将会围绕接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。总体来说,用三招就搞定了。到底经历了什么?温馨提醒一下,无论是在批量查询评价接口数据库,还是在业务系统中调用批量查询评价接口,使用多线程调用,都只是一个临时方案,并不完美。...

Admans的专栏 367

基于 ESP32 的智能环境监测与远程报警系统

本系统基于 ESP32 实现了环境数据的采集、远程传输、报警通知功能,硬件成本低、接线简单、代码可直接运行。用户可根据实际需求调整传感器类型(如替换为 PM2.5 传感器、土壤湿度传感器)和功能扩展,适合嵌入式 IoT 入门学习和实际场景应用。通过多轮迭代(如优化低功耗、增加 APP 控制),可进一步提升系统的实用性和稳定性。

weixin_42300449的博客 1025

离谱了,从20s优化到500ms,我仅用了这三招

接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。其实,我之前也写过一篇接口性能优化相关的文章《聊聊接口性能优化的11个小技巧》,发表之后在全网广受好评,感兴趣的小伙们可以仔细看看。本文将会接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。总体来说,用三招就搞定了。到底经历了什么?

wdj_yyds的博客 294

135、转动惯量辨识方法

<think>我们要求根据内容生成≤150字的文章摘要。内容是关于电机控制中转动惯量辨识的方法和工程经验。摘要需简洁概括核心:转动惯量重要性、三种方法(加减速法、正弦扫频、MRAS)、工程注意点(摩擦补偿、采样同步等)、实用建议(组合使用、滤波限幅、安全保护)。字数严格≤150。需要提炼。</think>转动惯量辨识是电机控制的关键,负载变化会导致速度环失稳。工程常用加减速法(简单可靠)、正弦扫频法(高精度)、MRAS在线辨识。实操需补偿摩擦、同步采样、控制激励幅度。建议混合使用,辨识结果需滤波限幅,并设置

2401_88858637的博客 41

YOLOv9改进策略目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好本专栏自开设两个月以来已经更新改进教程50余篇其中包含RepNCSPELAN4、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。同时本人一些讲解视频和包含我所有创新的YOLOv9文档并不能在优快云上传(所有的创新点都经过我的测试是可用的,得到该文件之后大家可以随意组合使用),所以会建立群的形式在内上传我的文件和视频我也会在群内不定期和大家交流回答大家问题,同时定期会更新一些文章的创新点(经过我融合测试后的,先到先得)。

Snu77的博客 1万+

从20s优化到500ms,我用了这三招,一文带你学习

接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。其实,我之前也写过一篇接口性能优化相关的文章《聊聊接口性能优化的11个小技巧》,发表之后在全网广受好评,感兴趣的小伙们可以仔细看看。本文将会接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。总体来说,用三招就搞定了。到底经历了什么?

程序源日志的博客 203

HarmonyOS 鸿蒙开发DevEco Studio OpenHarmony:安全测试

通过对HarmonyOS应用生命周期建模和应用攻击面建模,采用静态数据流分析技术,提高漏洞发现的准确率,同时覆盖20余种攻击面,65+漏洞测试项,帮助开发者提前发现和识别漏洞隐患。在检测报告中,会针对每一项漏洞风险项给出明确的修复建议,可以帮助开发者快速修复漏洞。

斌擎科技 1183

Java性能优化从20s优化到500ms,我用了这三招,内容知识满满

接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。其实,我之前也写过一篇接口性能优化相关的文章《聊聊接口性能优化的11个小技巧》,发表之后在全网广受好评,感兴趣的小伙们可以仔细看看。本文将会接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。总体来说,用三招就搞定了。到底经历了什么?

程序源日志的博客 1534

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

接口性能优化实战:从20s到500ms,三招搞定

因为如果在评价表中冗余一个组织code字段,万一哪天组织表中的组织code有修改,不得不通过某种机制,通知我们同步修改评价表的组织code,不然就会出现数据不一致的问题。查看该接口的调用信息,发现绝大数情况下,该接口响应还是比较快的,大部分情况都是500ms左右就能返回,但也有少部分超过了20s的请求。温馨提醒一下,无论是在批量查询评价接口查询数据库,还是在业务系统中调用批量查询评价接口,使用多线程调用,都只是一个临时方案,并不完美。接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。...

hebiwen95的博客 2512

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

mysql优化的魅力,从20s优化到500ms,仅需三招(荣耀典藏版)

接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。 本文将会接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。......

人生若只初相见@的博客 7万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从20s优化到500ms,我是如何做到的

接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。 本文将会就接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。 上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。 总体来说,用三招就搞定了。......

YYniannian的博客 203

sql 优化

一次SQL查询优化原理分析(900W+数据,从17s到300ms)有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms),按照下文的方式调整SQL后,耗时347 ms (execution: 163 ms, fetching: 184 ms);...............

qq_40813329的博客 611

接口优化及问题

接口优化及问题

jiayoubaobei2的博客 411

公司40岁的资深架构师,稳稳优化接口让性能提升40倍!

文章来源:https://juejin.cn/post/7115356843949424648前言接口性能问题,对于从事后端开发的同学来说,是一个绕不开的话题。想要优化一个接口的性能,需要从多个方面着手。本文将会接着接口性能优化这个话题,从实战的角度出发,聊聊我是如何优化一个慢查询接口的。上周我优化了一下线上的批量评分查询接口,将接口性能从最初的20s,优化到目前的500ms以内。总体来说,用三招...

架构师小秘圈 388

Home Assistant插件下载太慢?三招解决网络难题让智能家居秒响应

你是否遇到过这样的情况:兴致勃勃想给Home Assistant安装新插件,结果进度条半天不动?或者好不容易开始下载,却在99%时突然失败?这些问题背后往往藏着三个"隐形杀手"。 ### 症结一:国际网络通路不畅 Home Assistant的插件大多托管在国外服务器,就像从国外网购一样,路途遥远且关卡重重。普通连接就像走普通快递,经常遇到"海关查验"(网络限制)和"道路拥堵"(国际带宽不足)。

gitblog_00198的博客 507

Qwen3-4B镜像优化技巧:让老显卡(如GTX1660S)也能获得流畅体验

本文介绍了如何在星图GPU平台上自动化部署⚡Qwen3-4B Instruct-2507镜像,并针对GTX 1660 Super等老显卡提供优化技巧。通过系统清理、参数调优等方案,用户可在该平台上轻松部署此纯文本大语言模型,实现流畅的代码生成、文案创作等文本对话应用。

weixin_31961675的博客 180
上一篇: 美团一面:@Transactional 原理和常见的坑?
下一篇: Spring Batch 批处理框架,真心强啊!!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值