当前位置:首页>编程知识库>后端开发知识>面试官:在MySQL查询中,为什么要用小表驱动大表
面试官:在MySQL查询中,为什么要用小表驱动大表
阅读 1
2021-02-15
来源:cnblogs.com/developer_chan/p/9247185.html

1.为什么要小表驱动大表呢

类似循环嵌套
for(int i=5;.......)
{
     for(int j=1000;......)
     {}
}
如果小的循环在外层,对于数据库连接来说就只连接5次,进行5000次操作,如果1000在外,则需要进行1000次数据库连接,从而浪费资源,增加消耗。这就是为什么要小表驱动大表。

2.数据准备

tb_dept_bigdata表中插入100条数据,在tb_emp_bigdata表中插入5000条数据。
注:100个部门,5000个员工。tb_dept_bigdata(小表),tb_emp_bigdata(大表)。

3.案例演示

①当B表的数据集小于A表数据集时,用in优于exists
select *from tb_emp_bigdata A where A.deptno in (select B.deptno from tb_dept_bigdata B)
B表为tb_dept_bigdata100条数据,Atb_emp_bigdata5000条数据。
in的查询时间为:
将上面sql转换成exists
select *from tb_emp_bigdata A where exists(select 1 from tb_dept_bigdata B where B.deptno=A.deptno);
exists的查询时间:
经对比可看到,在B表数据集小于A表的时候,用in要优于exists,当前的数据集并不大,所以查询时间相差并不多。
②当A表的数据集小于B表的数据集时,用exists优于in
select *from tb_dept_bigdata A where A.deptno in(select B.deptno from tb_emp_bigdata B);
in的查询时间为:
将上面sql转换成exists
select *from tb_dept_bigdata A where exists(select 1 from tb_emp_bigdata B where B.deptno=A.deptno);
exists的查询时间:
由于数据量并不是很大,因此对比并不是难么的强烈。
附上视频的结论截图:

4.总结

下面结论都是针对inexists的。
in后面跟的是小表,exists后面跟的是大表。
简记:in小,exists大。
对于exists
select .....from table where exists(subquery);
可以理解为:将主查询的数据放入子查询中做条件验证,根据验证结果(truefalse)来决定主查询的数据是否得以保留。
 
  END
 


 十期推荐
 【201期】面试官:String长度有限制吗?是多少?还好我看过

 【202期】面试官:GET 和 POST请求的本质区别是什么?(本质没区别)

 【203期】吃透Java IO:字节流、字符流、缓冲流

 【204期】面试官:你手写过堵塞队列吗?

 【205期】面试官:数据量很大的情况下,对于分页查询你有什么优化方案吗?

 【206期】面试官:你的项目是如何处理重复请求/并发请求的?

 【207期】19张图带你梳理SpringCloud体系中的重要知识点!

 【208期】敲黑板,也来谈如何设计一个秒杀系统(重点)

 【209期】架构设计&分布式&数据结构与算法面试题(2020最新版)

 【210期】面试官:说说常用的Redis和zk两种分布式锁的对比
 

? ~
以上数据来源于网络,如有侵权,请联系删除。
评论 (0)