最近对sql优化,还有uri慢接口优化,遇到一些比较有意思的事情,这记录一下
最近接手APP产品,被用户吐槽蛮多的,主要是入库和出库的流程比较慢,查询慢。
看了一下同事写的代码,果然,复杂条件的查询写不出来就导致初级程序员容易foreach里面写dao,而且还是四层for循环里面不断调用dao取某一条件的数据。
这就导致一个接口要和数据库做几十万此io交互。希望大家以此为戒。
这里给出优化思路,也可能是我现在思维局限,想不出来更好的思路,因为每过一段时间去看之前写的代码都感觉很呆,哈哈哈相信大家也会有一样的想法。
1)减少和磁盘的io交互。
外键left join on关联条件,涉及到去重在sql中完成 。
2)适当在where字段建立索引,尽量根据业务场景建立联合索引,这里需要针对字段做总结,最多的必填字段建立联合索引,用的最频繁的字段在联合索引的最左边,因为索引的维护也需要一定的开销。(具体为什么在最左边可以自行百度)
3)多选查询应该也是一次拿到所有的数据在代码层做数据筛选,有的查询可以是2的n次方中情况,这里需要结合for进行判断。
4) 可以结合阿里巴巴的druid数据库连接池做简单的慢uri和慢sql的监控。及时优化。
5)使用exists和not exists的时候注意小表在外,大表在内,可以一定程度上优化性能。
6)百万以上的数据查询依旧会很慢,这时候需要做其他处理。
7)针对慢uri,存在接口调用的情况,这里我给的方法是同步改异步。采用多线程的方式进行远程api的调用,我们业务场景主要是数据推送,并不关心实时返回结果,等远程api返回结果以后再对记录做update.毕竟一次完整的http在并发比较大的情况下就会显得很漫长,所以还必须要把同步代码改为异步的。