一、sql优化
接口执行慢,很大一部分原因是因为未加索引,或者索引失效。
加索引能大大提高数据查询效率,这里不再多赘述,随着需求的迭代,重点整理一下索引不生效的一些场景。
我们可以通过查看sql执行计划来判断sql的索引使用情况。
除索引问题以外还有可能是关联表过多或者子查询过多
单表查询效率 > 关联查询效率 > 子查询效率
查询时关联的表最好不超过3个,如果sql有子查询,尽可能将子查询改为关联查询,如果关联查询过多导致sql查询慢,可以考虑优化表结构。
二、批量思想
主要包括两个方面:
一是批量操作数据库,例如我们在查询数据库时,需要根据id查询一批数据,切记不能一次查询一个id的数据
反例:
List<Student> studentList;
for(Student stu : studentList){
//数据库查询
Entity entity = mapper.findById(stu.getId);
}
正例:
List<Student> studentList;
//取id集合
List<Long> idList = studentList.stream.map(Student::getId)
.collect(Collectors.toList);
//数据库查询
List<Entity> entityList = mapper.findByIdList(idList);
这样做的原因是因为每次查询都会建立一次数据库连接,每次链接都耗时,所以需要批量一次性查询。
二是远程调用也需要批量,与操作数据库类似,每次远程调用都有时间损耗,因此我们需要干掉所有在循环内执行的远程调用,提取到for循环之外,然后利用map将我们需要的数据set到我们需要的位置。
三、异步
有部分接口对sql 以及 业务逻辑 的优化空间有限,不能满足性能标准,我们可以考虑异步,部分场景使用异步也能大大降低接口响应时间。
举个简单例子,我们现在有一个接口需要查询某公司信息 需要调用第三方定位接口(响应时间600ms),获取该公司详细地址,还需要调用第三方财务接口(响应时间450ms),查询该公司财务详情,还需要调用第三方人力接口(响应时间800ms),查询该公司人员规模。
这些查询都是第三方提供的接口,无法对其进行优化,三个查询加一块总共耗时1850ms,像这样的情况,我们可以使用异步,三个查询同时进行,执行完成的时间为三个查询中最长的那个,接口响应时间就是800ms。(本文不详细讲解异步实现方式,只讲优化思维)
四、合理使用缓存
查询缓存是最快的查询方式,合理的使用缓存,能大大提高接口性能,缩减响应时间。我们可以将一些常用的数据放入缓存当中,如本公司基本信息,像公司名称,地址,等等一些不会经常变动的数据放入缓存当中,在我们需要这些数据时,先查缓存,如果缓存中找到我们所需要的内容就无需查询数据库了,也能够缩减响应时间。