mysql in 优化 大量_MySQL优化 — exists与in谁快谁慢?


    相信很多开发人员或DBA经常为exists与in到底谁效率比较高而感到困扰。    而exists和in是半连接(SEMI JOIN),什么是半连接?半连接就是两张表进行关联只返回一个表的数据。所以半连接也属于表连接,既然是表连接,我们就需要关心两表的大小以及两表之间究竟走什么连接方式,从而有目的地去控制两表之间的连接方式,才能随心所欲地优化SQL。  in/exists语句分析
-- in语句select a.* from aaa a where a.id in ( select id from bbb b);-- exists语句select a.* from aaa a where exists (select null from bbb b where b.id=a.id);
  •  IN操作相当于对inner table执行一个带distinct的子查询,然后得到的查询结果集再与outer table进行连接,连接方式的索引的使用就等同于普通的两表之间的连接。
  • EXISTS操作相当于对outer table进行全表扫描,用从中检索到的每一行与inner table做循环匹配输出响应的符合条件的结果,其主要开销是对outer table的全表扫描,exists()会执行a.length次,它不缓存exists()的结果集,因为其结果集不重要,重要的是结果集中是否有记录。
实验与结论 测试对象数据库版本 5.7.31 用mysql的employees数据库来测试,其中外键约束已删除

bbc87432d481a6905b7b2b2b2560de2c.png

测试结果
/* 子表数据量小,外表数据量大*//* FirstMatch是mysql在处理半连接的时候使用的一种优化策略 */mysql> explain   select count(*) from salaries a where a.emp_no in (select b.emp_no from employees b) ;+----+-------------+-------+------------+-------+---------------+---------+---------+--------------------+--------+---------
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值