接口慢主要分为几方面:
1、多做了不必要的查询
全部用select *,或者业务查询的时候没有考虑清楚多做了其他没必要的查询。
2、外部调用的接口过多
循环调用接口获得数据(这个是比较严重的问题);或者接口内部使用了很多外部的接口调用。
3、没有命中索引
查询中用了like '%[search]%'、空值比较、!=、or查询手段都会导致索引不命中;复杂索引由于定义了字段的命中顺序,左侧的字段没有添加入查询就不会命中;排序没有命中索引,但是需要排序的内容超过了缓冲区大小。
4、定义了不必要的索引
show index from table查看每个索引的基数,有些索引的字段基数非常大但是查询的关键不在于他,需要更改结构降低基数或者直接去掉索引,还有些数据分布单一的字段被定义了索引也可以去掉。
5、命中了太多索引被mysql默认算法合并了
mysql会自动合并索引查询的交集,有时候并没有比命中单个索引查询更快,或者可以直接定义一个复杂索引。
解决方案整理:
1.两表关联查询在leftjoin和exists和in中选择的时候,大部分情况下都用leftjoin,只有在特定条件下推荐使用exists(A表根据B条件搜索,A表数据量少,B表数据量大,查询条件都加索引,存在A表的搜索条件,可能条件不带索引)。
2.orderBy+limit,mysql存在数据接口的优化,不会对表全部排序,而会处理limit数量的排序之后结束排序,复杂度降为k*O(n);另外排序尽量用索引字段排序。
3.索引优化,建立复杂索引之后建议加上条件全部命中,部分命中的查询效率更低,这是从索引唯一性的标准出发的。
4.去重select distinct和group by的抉择,优先选用group by,更快。
5.json数据添加索引,特定字段增加虚拟列索引。
6.强制命中索引,或者忽略某些索引的命中(不推荐,但是在没有重构却要优化的情况下非常有用)。
7.整理频繁查询的sql,梳理索引整合复杂索引。