java 联表查询优化从13s到1s

场景

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语句,再进行其他的优化,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值