今天在工作当中遇到一个需要联多张表查询的业务场景,心里大概知道如果正常写,放在线上去绝对是一个慢查询,于是乎就想了一些优化的点,下面整理出来,我主要是讲讲思路,因为每个业务场景会不同,如果看到文章的大佬们有更好的方法,希望大佬们评论指出来哈,小弟在此跪谢了!
我们先来看一张图片
通过explain工具得出,id是相同的,查询表的顺序就是从上至下,o->ol->ors->toi->oor,然后我们再看type字段,其中o和toi都是全表扫描,o表在生产环境中数据量是巨大的,绝对不允许出现全表扫描操作,所以我们就需要根据这个来优化,让两个全表扫描降级;
ps:type字段按照性能排序system > const > eq_ref > ref > range > index > all,all是性能最低的,对于sql语句,至少要达到range级别;
通过业务场景可以将其中两个left jion改为inner jion,而且查询日期在生产环境是有限定的,我们可以将语句修改如下;
这个时候可以看出就只会扫toi全表,通过业务逻辑分析,o 与 toi 是 inner join 关系,我们可以通过分析具体的业务逻辑来给一个满足条件的时间范围;
这个时候就可以达到一个稍微的优化了;