今天在工作当中遇到一个需要联多张表查询的业务场景,心里大概知道如果正常写,放在线上去绝对是一个慢查询,于是乎就想了一些优化的点,下面整理出来,我主要是讲讲思路,因为每个业务场景会不同,如果看到文章的大佬们有更好的方法,希望大佬们评论指出来哈,小弟在此跪谢了!

我们先来看一张图片

image.png

通过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,而且查询日期在生产环境是有限定的,我们可以将语句修改如下;

image.png

这个时候可以看出就只会扫toi全表,通过业务逻辑分析,o 与 toi 是 inner join 关系,我们可以通过分析具体的业务逻辑来给一个满足条件的时间范围;

image.png

这个时候就可以达到一个稍微的优化了;

呃,简单说一下思路,因为每个人遇到的业务场景可能会不一样...

1.写语句的时候,先在测试环境利用explain工具看一下大致的情况

2.个人觉得的几个关键点就是,type的all一定要杜绝,当然,数据量很小的时候,可能是以这张表为驱动来执行查询的,视业务情况而定

3.id字段如果相同,执行查询的顺序就是从上至下

最后,多表联接的时候,字段最好明确出来,千万不要 select * ,这里为了简洁,所以用了 select * ,希望大佬们看到文章多多指点,对于另外的一些字段,由于本人有些也理解也很模糊,等到了解清楚之后再来更新,请多多谅解!再次跪谢!