mysql在连表查询时是小表驱动大表吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql在连表查询时是小表驱动大表吗相关的知识,希望对你有一定的参考价值。

参考技术A 你那样写逻辑都变化了
假定你要选择的b的field位bf
这昂写就可以了,XXX是要选择的字段列表(不包含b.bf)
SELECT xxx,
CASE b.num WHEN 1 THEN b.bf ELSE NULL END
from a left join b on b.opuid=a.uid
where a.true=1
不知道mysql支持不支持case when,也就是作了一个判断if b.num =1 then b.bf else null
参考技术B rows代表这个步骤相对上一步结果的每一行需要扫描的行数,可以看到这个sql需要扫描的行数为35773*8134,非常大的一个数字。本来c和h表的记录条数分别为40000+和10000+,这几乎是两个表做笛卡尔积的开销了(select * from c,h)。
于是我上网查了下MySQL实现join的原理,原来MySQL内部采用了一种叫做 nested loop join的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复,基本上MySQL采用的是最容易理解的算法来实现join。所以驱动表的选择非常重要,驱动表的数据小可以显著降低扫描的行数。本回答被提问者采纳
参考技术C 这个看你连接的顺序还有连接的方式,从上到下

223期面试官:在MySQL查询中,为什么要用小表驱动大表

来源: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条数据。

【223期】面试官:在MySQL查询中,为什么要用小表驱动大表
【223期】面试官:在MySQL查询中,为什么要用小表驱动大表

注: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_bigdata:100条数据,A表tb_emp_bigdata:5000条数据。

用in的查询时间为:

【223期】面试官:在MySQL查询中,为什么要用小表驱动大表

将上面sql转换成exists:

select *from tb_emp_bigdata A where exists(select 1 from tb_dept_bigdata B where B.deptno=A.deptno);

用exists的查询时间:

【223期】面试官:在MySQL查询中,为什么要用小表驱动大表

经对比可看到,在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的查询时间为:

【223期】面试官:在MySQL查询中,为什么要用小表驱动大表

将上面sql转换成exists:

select *from tb_dept_bigdata A where exists(select 1 from tb_emp_bigdata B where B.deptno=A.deptno);

用exists的查询时间:

【223期】面试官:在MySQL查询中,为什么要用小表驱动大表

由于数据量并不是很大,因此对比并不是难么的强烈。

附上视频的结论截图:

4.总结

下面结论都是针对in或exists的。

in后面跟的是小表,exists后面跟的是大表。

简记:in小,exists大。

对于exists

select .....from table where exists(subquery);

可以理解为:将主查询的数据放入子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据是否得以保留。

 
   
   
 

END

十期推荐











以上是关于mysql在连表查询时是小表驱动大表吗的主要内容,如果未能解决你的问题,请参考以下文章

134 MySQL多表查询

NL连接一定是小表驱动大表效率高吗

了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表

mysql 为啥小表放前面查询时间 比大表放前面查询时间长?

python 数据库连表查询习题

在MySQL查询中,为什么要用小表驱动大表