in和join的性能比对

最近做了许多统计的接口,写的时候尽量以纯sql实现统计,但是今天碰到一个问题,就是有一个页面刷新的次数过多的话会导致mysql的进程达到99%左右,一直想不通,就是一个查询,咋么cpu瞬间就那么高了呢,然后通过show full processlist 语句查询了一下所有的mysql的进程,发现在执行某条sql的时候时间能达到好几秒,所以剩下的时间就是去优化sql了
先说下我的sql大致就是 region_code in(select region_code from var_region where park_code in (select park_code from var_park where city_code=‘xxxxx’)) ,大致就是子查询里面嵌套子查询,在嵌套子查询,然后又用in作判断,导致每次查询数据库要经过大量的比对计算,最后直接换成join查询,顺便速度上去了,那么这里的in和join的区别到底有多大呢?
一、数据量大的时候建议使用join查询,因为使用in的时候循环的次数远远大于join,最起码在我的情景中是这样(不涉及order by);
二、驱动表:什么是驱动表?mysql在join表连接时会选择一个结果集较小的表作为驱动表,再以此遍历被驱动表,explain查看执行计划时,第一行的表就是驱动表。如果对驱动表的字段order by,是没有问题的。但是如果对被驱动表order by,则会产生using temporary,以及filesort,性能可想而知!你能保证a表一定是驱动表吗?不一定!就算没有其它任何查询条件,全表数据a表比b表小,但是随着时间推移,a表的数据也可能变得比b表大,另外再加上查询条件,两个表实际返回的结果集不敢确定谁大谁小。所以在有order by的情况下,建议使用exists或者in子查询代替,但是需要注意的是,关于in,如果a表数据量级比b表小,性能可能不是很高,而且,有时候mysql优化器会将in转化为join表连接,执行计划其实是一样的。而对于exists,如果a表数据量级比b表大,性能很可能不高;
三、最常见的子查询中,in子查询会被优化为join(5.7版本)。in适合什么场合呢,如果后面的value list很少,而且字段上存在索引,甚至是主键,这个时候用in性能比较高,但是当value list达到一定的临界值的时候会导致All全表扫描。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值