场景
mysql联表查询,在已有的user关联其他表的情况下,加了第三张关联表后,查询变的很慢,比如,用户user表又关联了标签tag表,user的数据量是几十万,而tag表的数据量是几十,
刚开始的错误写法
select t1.* from user t1 left join user_desc t2 on t1.id = t2.uid
inner join t3 on t3.uid = t1.id
where ......
由上述sql可看到,t3和t1、t2的联表的结果又进行了一个innr join ,
问题:
①由于数据库是分库分表结构,也没有加分库分表键进行查询 ,
②t1和t2表的联表结果是几十万,几十万的数据再和一个t3几十条的数据进行联表查询对比,一下子速度就慢了下来,回表的数据有几十万,
所以查询效率一下子就变成了13s,
我的修改
select t1.* from user t1
inner join t3 on t3.uid = t1.id and t1.manage_uuid=t3.mamage_uuid
left join user_desc t2 on t1.id = t2.uid
where ......
上面是我的最新修改,修改内容如下
①根据数据库优化原则—"最小左前缀原则 ",把t3表,数据量少的表先查询,然后再和t2表进行关联,这样就少了很多数据
②加上分库分表键 ,指定要查询的数据库,而不是每个数据库都检索一遍
综上结果,数据库查询速度从13s到1s左右,
当然可以再根据 explain + 查询的sql语句,再进行其他的优化,