一:接口的性能优化
1、批处理:在循环插入场景的接口中,在批处理执行完成后一次性插入或更新数据库,避免多次IO
2、异步处理:针对耗时较长且不是结果必须的逻辑,可以考虑放到异步执行,降低接口耗时
异步的实现方式:线程池,消息队列,调度任务框架
3、空间换时间:合理使用缓存,针对一些频繁使用且不频繁变更的数据,可以提前缓存起来,需要时直接查缓存,避免频繁的查询数据库或者重复计算
缓存:redis,memcached,R2M,本地缓存,或者Map
4、预处理:预取思想,提前把要查询的数据提前计算好,放入缓存或者表中的某个字段,用的时候会大幅提高接口性能
5、池化思想:避免重复创建对象或创建连接,可以重复使用,避免不必要的损耗,毕竟创建销毁也会占用时间。池化思想的本质是预分配和循环使用
池化思想的体现:数据库连接池,线程池等
6、串行改并行:串行就是当前执行逻辑必须等上一个执行逻辑结束之后才执行,并行就是两个执行逻辑互不干扰,所以并行相对来说就比较节省时间,当然 是建立在没有结果参数依赖的前提下
7、索引:能大大提高数据查询的效率,在接口设计之初就应该考虑到
索引不生效场景:
1)隐式类型转换
2)select *
3)对索引进行列运算(+,-,*,/)
4)不满足最左匹配原则
5)使用or关键字——在MYSQL5.0之前
6)not in 和 not exists
7)order by 和搜索列不匹配
8)使用了<>,!=
9)like 以通配符开头(‘%abc’)
8、避免大事物:所谓大事物就是运行时间比较长的事物,由于事物一直不提交会导致数据库连接一直被占用,影响到别到请求访问数据库,影响性能
避免大事物的方案:
1)RPC调用不放到事物里面
2)查询操作尽量不放到事物中
3)事物中避免处理太多数据
9、优化程序结构:在多人维护一个项目时,多次需求迭代,代码叠加形成一些重复查询,多次创建对象等耗时问题,需要对接口整体进行重构,评估每个代码 块的作用和用途,调整执行顺序。
10、深分页问题:select * from product where status=1 and id >100000 limit 20;
优点:命中了主键索引,无论多少页性能都还不错,局限性是需要一个连续自增的字段
11、sql优化
12、锁粒度避免过粗:锁一般是为了在高并发场景下保护共享资源采用的一种手段,但是如果锁的粒度太粗,会很影响接口性能的,只需要在临界资源处加锁 即可,不涉及共享资源的不必要加锁。
例:你要上卫生间只需要把卫生间的门锁上就行,不需要把客厅的门也锁上。