接口性能优化的技巧

一. 索引

索引优化的成本是最小的,可以通过线上日志或者监控报告,查到某个接口用到的某条sql语句的耗时。

1.1 没加索引

sql语句中where条件的关键字段,或者order by后面的排序字段,忘了加索引。

1.2 索引没生效

可以通过explain执行计划查看索引的使用情况

常见的索引失效原因:不满足最左前缀原则,范围索引列没有放最后,使用了select * ,索引列上有计算,索引列上使用了函数,字符类型没加引号,用is null和is not null没注意字段是否允许为空,like查询左边有%,使用or关键字时没有注意等等。

1.3 选错索引

明明是同一条sql,只是入参不同而已,有的时候走的索引a,有的时候走的是索引b?必要时可以使用force index来强制查询sql走某个索引。

二. sql优化

如果优化索引后,也没啥效果,就需要试着优化sql语句,相比较java代码来说,这种方式的成本要小得多。

sql优化技巧:

2.1 避免使用select * ,它不会走覆盖索引,会出现大量回表操作,从而导致查询sql的性能很低。在我们日常开发时,

应只查需要用到的列,多余的列无需查出来。

2.2 用union all 代替union ,我们都知道sql语句使用union关键字后,可以获取排重后的数据,而如果使用union all关键字,可以获取所有的数据,包含重复的数据。排重的过程需要遍历,排序和比较,它更耗时,更消耗cpu资源。除非业务场景需要,否则尽量使用union all。

2.3 小表驱动大表,in 适用于左边大表,右边小表,exists适用于左边小表,右边大表。

2.4 批量操作,在代码中重复性调用数据库,每次远程请求建立连接都是会消耗一定性能的,对于一些批量插入的业务场景,可以将多条sql合并为一条执行。

2.5 多用limit,

2.6 in中的值太多,尽量分批查询

2.7 增量查询,

2.8 高效的分页,将limit的开始位置使用where条件替换

2.9 用连接查询代替子查询,子查询会创建临时表,查询结束后再删除,有额外的性能消耗,可以使用连接查询优化

2.10 join的表不应该太多,尽量不超过3个

2.11 提升group by 的效率,先用where条件圈定范围,在使用group by

三. 远程调用

3.1 对于多个调用的场景可以使用线程池异步执行,结果的获取可以通过CompleteFuture去实现

3.2 数据异构,将不相关的数据全部排除,需要用的数据全部通过某个任务整合到一起,这样查询时只需要调用一次即可(适用于离线数据,如果对数据实时性要求较高,则有数据一致性的问题)

四. 异步处理

通过梳理业务逻辑,核心逻辑可以同步执行,同步写库,非核心逻辑,可以异步执行,异步写库。

通常异步主要有两种:多线程和mq。

五. 避免大事务

大事务可能引发的问题:死锁,回滚时间长,并发情况下数据库连接池被占满,锁等待,接口超时,数据库主从延迟等等...

优化方式:少用@Transactional注解,将查询方法放在事务外,事务中避免远程调用,事务中避免一次性处理太多数据,有些功能可以非事务执行,有些功能可以异步处理(调用类中的私有方法会使事务失效,可以通过代理调用)。

六. 锁粒度

在某些业务场景下, 为了防止多个线程并发修改某个临界资源,造成数据异常,我们会选择 加锁

6.1 synchronized

java 中提供了synchronized关键字给我们的代码加锁,通常是在方法上 和 在代码块上 加锁。但是在加锁的过程中,需要注意锁的范围,也就是锁粒度,尽量只加在会产生数据竞争的地方

6.2 redis分布式锁的八大坑

非原子操作:setNx 与 expire 命令分开执行,非原子操作

忘了释放锁:在try-cathc-finally 中增加释放锁的操作

释放了别人的锁:假设线程A和线程B都使用了lockKey加锁,线程A加锁成功了,但是由于业务逻辑执行耗时较长,锁超时释放了,这时线程B加上了锁,线程A执行结束后将lockKey释放,这就是一个典型的案例。所以在加锁的过程中,需要多设置一个requestId,自己只能释放自己加的锁,不允许释放别人加的锁。

大量失败请求:可以通过自旋锁解决

锁重入问题:使用可重入锁

锁竞争问题:细化锁粒度,使用读写锁,分段锁

锁超时问题:使用TimeTask实现自动续期功能(看门狗机制)自动续期的功能是获取锁之后开启一个定时任务,每隔十秒判断一下锁是否存在,如果存在则刷新过期时间,如果续期三次,也就是三十秒后。业务方法还是没有执行完,就不再续期了。

主从复制的问题:使用RedissonRedLock。

6.3 数据库分布式锁

mysql数据库主要有三种锁,

表锁:加锁快,不会出现死锁,但锁粒度大,发生锁冲突的概率最高,并发度最低。

行锁:加锁慢,会出现死锁,但锁粒度最小,发生锁冲突的概率最低,并发度也最高。

间隙锁:开销和加锁时间介于表锁和行锁之间,会出现死锁,锁粒度介于表锁和行锁之间,并发度一般。

在数据库锁的优化方向是:优先使用行锁,其次使用间隙锁,再使用表锁。

七. 分页处理

将一次获取所有的数据请求,改成分多次获取,每次只获取一部分用户的数据,最后进行合并和汇总。

八. 加缓存

九. 分库分表

十. 辅助功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475577.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK安装和Linux常见设置详细版教程

一、Linux的常见设置 1、设置静态IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 如何查看自己的虚拟机的网关: 完整的配置(不要拷贝我的): TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no&…

【Visual Studio系列教程】如何在 VS 上编程?

上一篇博客中,我们介绍了《什么是 Visual Studio?》。本文,我们来看第2篇《如何在 VS 上编程?》。阅读本文大约10 分钟。我们会向文件中添加代码,了解 Visual Studio 编写、导航和了解代码的简便方法。 本文假定&…

python: generator model using sql server 2019

設計或生成好數據庫,可以生成自己設計好的框架項目 # encoding: utf-8 # 版权所有 :2024 ©涂聚文有限公司 # 许可信息查看 :言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述: : 生成实体 # Author …

【Rabbitmq篇】RabbitMQ⾼级特性----消息确认

目录 前言: 一.消息确认机制 • ⾃动确认 • ⼿动确认 手动确认方法又分为三种: 二. 代码实现(spring环境) 配置相关信息: 1). AcknowledgeMode.NONE 2 )AcknowledgeMode.AUTO 3&…

【Pikachu】SSRF(Server-Side Request Forgery)服务器端请求伪造实战

尽人事以听天命 1.Server-Side Request Forgery服务器端请求伪造学习 SSRF(服务器端请求伪造)攻击的详细解析与防范 SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种安全漏洞,它允许攻击者通…

鸿蒙NEXT自定义组件:太极Loading

【引言】(完整代码在最后面) 本文将介绍如何在鸿蒙NEXT中创建一个自定义的“太极Loading”组件,为你的应用增添独特的视觉效果。 【环境准备】 电脑系统:windows 10 开发工具:DevEco Studio NEXT Beta1 Build Vers…

JSONObject jsonObject = JSON.parseObject(json);

是用于将一个 JSON 格式的字符串解析为一个 JSONObject 对象的语句。具体来说: JSON.parseObject(json): 作用: JSON 是 FastJSON 库提供的一个工具类。parseObject 方法可以将 JSON 格式的字符串(例如:{"key1&qu…

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析

目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …

【面试题】接口怎么测试?如何定位前后端的Bug?

接口怎么测试? 接口测试用来验证不同软件组件之间的交互是否正常。包括验证数据传输,参数传递,我在多个项目中有过测试接口的经验。(… 当进行接口测试时,会使用Postman和Python的Requests库。首先根据接口文档设计测…

.net6.0(.net Core)读取 appsettings.json 配置文件

① 新项目中创建名为 appsettings.json 的 json文件,内容为: {//数据库连接字符串:"ConnectionString": {"DBconn": "server127.0.0.1;databasedb;uidsa;pwd123456;Timeout600;EncryptTrue;TrustServerCertificateTrue;"…

应用于各种小家电的快充协议芯片

前言 随着快充技术的广泛应用,以往小家电的慢充模式已经满足不了人们对充电速度的要求,因此商家纷纷对小家电应用了诱骗取电快充协议芯片 例如(XSP16H),有了快充的支持小家电的充电速度有了很大的提升,节省了很多的充电…

ftrack 24.10全面升级:Autodesk Flame集成与多项新功能性能改进将发布

管理复杂项目绝非易事,但ftrack Studio的最新更新旨在简化这一过程。我们设计了这些增强功能,以优化大家的工作流、提高可用性,并让你们有更多时间专注于创意工作。 让我们来看看都有什么新内容吧! ​增强功能来优化工作流 轻松…

网络工程师教程第6版(2024年最新版)

网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。 相关信息: 出版社: 清华大学出版社 ISBN:9787302669197 内容简介: 本书是工业和信息化部教育与考试中心组织编写的考试用书。本书 根据…

Leetcode739.每日温度(HOT100)

链接 第一次暴力提交错误&#xff0c;超时了&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();vector<int> res(n,0);for(int i 0;i<n;i){int j i1;while(j<n){i…

java八股-SpringCloud-服务雪崩,服务降级,服务熔断

文章目录 服务雪崩服务降级服务熔断本章小结 服务雪崩 服务降级 服务熔断 本章小结 服务降级针对的是接口不可用&#xff0c;服务熔断针对的是整个服务不可用&#xff01;

cesium for unity的使用

先聊聊导入 看到这里的因该能够知道&#xff0c;官网以及网上绝大多数的方法都导入不进来&#xff0c;那么解决方法如下: 两个链接&#xff1a;按照顺序依次下载这两个tgz和zip&#xff0c;其中tgz为主要部分&#xff0c;zip为示例工程项目 如果您要查看示例工程项目的话&am…

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…

Win11 24H2新BUG或影响30%CPU性能,修复方法在这里

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; 一招提升Win11 24H2 CPU 30%性能&#xff0c;小BUG大影响 就在刚刚&#xff0c;小江在网上冲浪的时候突然发现了这么一则帖子&#xff0c;标题如下&#xff1a;基准测试&#xff08;特别是 Time…

华为openEuler考试真题演练(附答案)

【单选题】 以下关于互联网的描述&#xff0c;哪个选项是正确的? A:Nginx 在万维网中可以作为 ftp 服务器的反向代理&#xff0c;并与ftp服务器的数量--对应 B:Nginx 在互联网中可以作为 web服务器端&#xff0c;成为万维网的一个节点 C:互联网上的的资源需使用 Nginx进行七层…

Hello-Go

Hello-Go 环境变量 GOPATH 和 GOROOT &#xff1a;不同于其他语言&#xff0c;go中没有项目的说法&#xff0c;只有包&#xff0c;其中有两个重要的路径&#xff0c;GOROOT 和 GOPATH Go开发相关的环境变量如下&#xff1a; GOROOT&#xff1a;GOROOT就是Go的安装目录&…