mysql里面的in和exists区别

说这个之前我们要先知道mysql是提倡小表驱动大表的,什么意思呢 我们看两个循环

// 循环一
for(int i = 0;i >= 100000;i++){
	for(int j = 0;j>= 100;j++){
		........
	}
}

// 循环二
for(int i = 0;i >= 100;i++){
	for(int j = 0;j>= 100000;j++){
		........
	}
}

这两个循环看上去没什么区别,但是开发人员都会选择第二种,我们可以吧少的外层循环看成小表,里面大的内层循环看成大表,这样就是简单的小表驱动大表了.
在结合sql来看一下:t_emp员工表数据量大于t_dept部门表

使用in

select * from t_emp te where id in (select emp_id from t_dept)
由于mysql的执行规则是从内循环到外循环,这条sql其实相当于 先查出来部门的emp_id之后通过emp_id去一一匹配t_emp的id
也就是上面的循环二(小表驱动大表)

使用exists

select * from t_emp tm where exists (select 1 from t_dept td where tm.id = td.emp_id)
因为exists的执行规则问题,导致其会先执行外面的sql也就是
select * from t_emp 这这张表,之后通过这张表的id去里面的查询循环判断如果存在就返回true保存外sql的记录反之不保存,这就相当于循环一,也就是大表驱动小表会变慢不推荐!

总结

使用in的时候内查询的数据要小于外查询的数据,
使用exists的时候外查询的数据小于exists的查询数据

延伸思考

但是这时候肯定很多同学会考虑到大表驱动小表效率应该差不多因为都需要便利相同次数,没错确实是的,但是同学们要考虑到概率
假设现在大表有10条数据小表2条,那么大表驱动小表每次循环都有百分之50的可能要全部便利,而反过来小表驱动大表每次只有百分之10的概率会全部便利.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值