MySQL子查询优化-子语句含有group by时


当我使用Mysql进行下列语句的查询时:
select count(1) from jy_info_user 
where user_card != '' 
and id IN (select id from jy_erp.jy_info_user where ifnull(user_card,'')!='' group by user_card HAVING count(1)=1 )



很简单的一个统计数量,却用了一分多钟。
我的数据有3万多条,这样查下来,每次查询太慢。于是去百度了一下。


下面是网上查询比较多的关于MYsql子查询优化的文章:
http://www.cnblogs.com/xh831213/archive/2012/05/09/2491272.html


里面只是说到了子查询,很明显,我的子查询中有group by,遇到这种情况,一般想到的是,不适用


于我这种子查询。


有没有优化的方案呢?


于是我将子查询语句包装成一个独立的表,再进行查询:
select count(1) from jy_info_user 
where user_card != '' 
and id IN ( select id from (select id from jy_erp.jy_info_user   where ifnull(user_card,'')!='' group by user_card HAVING count(1)=1 )  as users )


其实这样没有任何作用,依旧很慢。


想到在join上面下工夫,因为上面的文章中,提到join是最快的方式:


于是写出了这样的语句:
select count(1) 
from jy_info_user a
join (select id from jy_erp.jy_info_user where ifnull(user_card,'')!='' group by user_card HAVING count(1)=1 ) as b on a.id=b.id
where a.user_card != '' 



查询出结果:0.17s,比之前快太多了,基本上能够接受。


可以看出,查询语句使用了上面两种方式:
1. 将需要group by 的语句 作为一个表进行包装,得到新的表数据。
2. join 可以将两个表进行级联查询,从而避免了多对多的数据关系。


因为join本身包含了筛选的功能,所以查到的结果,都跟子语句的数据有关联。


这样就大功告成了!
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

willgon123

谢谢打赏,我将再接再厉!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值