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