将left join拆分成多条sql语句

本文讲解如何把一条带有一个或多个left join或right join的sql语句拆分成多条sql语句。MySQL进行连表查询效率是很低的,特别是数据很大,而且并发量很高的情况,索引都无法解决问题,最好的办法就是把sql语句拆分成多条单表查询的sql。

我们公司电商网站现在要做网站服务化,用java做中间件,PHP调用java接口获取数据,数据表也进行了拆分,分库,要求不使用连表查询,有连表查询的sql语句想办法拆分多条sql语句,然后统一使用java接口。

这样做的目的一是为了网站服务化做调整,数据的增删查改都封装到具体的业务里面,二是为了提高性能,减少数据库压力,说来说去还是为了提高效率。

我们看看一个join多张表的sql如何拆分多条sql。

select u1.uid,u1.uname,u2.add from user as u1 left join userinfo as u2 on u1.uid=u2.uid left join money as u3 on u1.uid=u3.uid where u1.country='c'

这条sql语句left join三张表,分别是user作为主表,连userinfo,money表。首先可以查出所有user的数据,有了第一条拆分的sql:

select uid,uname from user where country='c'

由于条件是user.uid=userinfo.uid,所以可以把取得的uid用”,”连接,第二个拆分的sql如下:

select uid,add from userinfo where uid in(32,34,23,23)

这样得出了符合第一个left join条件下的uid,uname和add字段的结果,其实到这里就已经实现了以上left join语句的需求,如果还要查询money表的字段,以此类推,把uid作为in的条件查money表。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用中的解释,方案二中的子查询在MySQL中会被自动优化直接的左连接,因此在执行explain命令时并没有出现差异。然而,在子查询中加入了having子句后,MySQL无法自动优化直接的左连接,因此按照SQL语句调用顺序执行,导致explain结果中出现了一个额外的子查询行。这样实现了原本的目的,即从10,000 x 10,000 x 10,000的复杂度降低到10,000 x 10,000的复杂度,从而提升了速度。 根据引用中的方案二的描述,通过将两次左连接合并为一次来减少笛卡尔积的操作,可以显著提升速度。具体的SQL结构如下: ``` select p.id,p.name,pss.sort from table1 p left join ( select name,sort from table2 ps left join table2 ps2 on ps.name = ps2.name and ... where ... ) pss on p.name = pss.name where ... order by pss.sort asc,p.sale desc,p.time desc limit 0,10 ``` 而引用中提到的第三种解决方案是将SQL语句拆分开来,因为是左连接,关联关系可以分开执行,然后逐个执行,观察执行情况。 因此,根据以上三个引用的内容,可以得出解决MySQL左连接特别慢的三种方法,即通过优化子查询、合并左连接操作和拆分SQL语句来提升速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [mysql 优化慢复杂sql (多个left join 数量过大 order by 巨慢)](https://blog.csdn.net/qq_40835969/article/details/128239398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [mysql left join 查询慢的问题排查](https://blog.csdn.net/tianjiliuhen/article/details/127446340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值