🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云星级博主
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
🔥 联系方式vx:zsqtcc
🤞面试官偷偷告诉我:如何优化提升接口的性能🤞
正菜来了⛳⛳⛳
🎈索引优化
- 这个接口对应的sql是否加了索引
- 这个接口对应的sql加的索引是否生效
- 这个接口对应的sql是否选错了索引
- 使用explain进行分析
explain select * from `table1` where id=1;
🎈sql语句改进
- 避免使用 select * ,因为网络IO和文件IO以及回表的原因
- 小表驱动大表
- 批量操作,foeach的多条语句换成Batch处理,
- limit分页查询,避免查询过多数据
- 连接查询代替子查询
- 尽量使用索引
🎈接口中业务并行执行
如需要查询用户信息,积分信息,成长值信息
在原来串行的基础上改为并行执行,可以使用多线程的方式执行。
🎈数据缓存优化
对于缓存,我们可以使用多级缓存。
- 客户端缓存:使用浏览器缓存css,js,图片等静态资源
- 负载均衡缓存/CDN缓存:基于Nginx的负载均衡节点处进行缓存。
- 进程内缓存:如springmvc的缓存,mybatis的一二级缓存,可以使用Encache,cafein这些工具。
- 分布式缓存:如redis缓存。
🎈禁止重复调用
- 重复调用mysql
Eg:searchList.forEach(user -> result.add(userMapper.getUserById(user.getId())));
业务层使用for循环与mysql数据库频繁交互。
改进:可以对语句及进行优化,把id的集合放到一起,然后查询优化。 - 重复调用缓存
和mysql一样进行优化即可。 - 禁止使用while(true) 和 递归 ,在某些场景下就可能出现死循环的问题。
🎈异步优化
- 使用阻塞/消息队列
- 使用线程池
🎈锁的粒度优化
public void test(String a1,String b1,String c1) { synchronized(this) { sout(a1); sout(b1); sout(c1); } }
优化后
public void test(String a1,String b1,String c1) { synchronized(this) { sout(a1); } sout(b1); sout(c1); }
🎈分库分表
当用户数量逐渐变多的时候,数据表里存储的数据也越来越多,单表或者单库有可能存不下。由于数据量太大,sql语句查询数据时,就算是走了索引也会非常耗时就需要分库分表处理了。
🍚总结
上边也是我整理的一些优化的方法,不行了肝不动了,休息了休息了。