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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 为啥小表放前面查询时间 比大表放前面查询时间长?相关的知识,希望对你有一定的参考价值。

参考技术A 这个涉及到关联查询的时候使用的驱动表和被驱动表的概念。
一般情况下,遵循如下规则:
a left join b,a是驱动表,b是被驱动表。
a right join b,b是驱动表,a是被驱动表。
a inner join b,mysql会选择相对小的表作为驱动表,大的表作为被驱动表。这里的大和小,你可以理解为真正参与关联查询的数据行多的为大表,少的为小表。除了参与关联的数据量之外,参与关联的字段数目也会影响哪个表称为大表哪个表称为小表。这个MySQL会综合衡量参与关联的两张表中的行和列数据总和来决定使用哪个表作为驱动哪个表作为被驱动表。

而我们平时进程使用的是left join查询居多,而left join总会把left前面的表作为驱动表,所以这就给我们造成一个错误的认识:小表写在前面性能较高。
其实,这是一个以偏概全的观点。原因有如下两点:
如果是使用right join语句,此时的小表写在前面,反而不是性能最高的体现。
而inner join会由MySQL自己选择驱动和被驱动表,所以,不会因为我们表的位置而影响到性能。

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 为啥小表放前面查询时间 比大表放前面查询时间长?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

单链表放字符

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

查询优化--小表驱动大表(In,Exists区别)

(转)hive调优 coding调优