天天看點

MySQL進階知識(十六)——小表驅動大表

前言:本來小表驅動大表的知識應該在前面就講解的,但是由于之前并沒有學習資料批量插入,是以将其放在這裡。在查詢的優化中永遠小表驅動大表。

1.為什麼要小表驅動大表呢

類似循環嵌套

for(int i=5;.......)
{
     for(int j=1000;......)
     {}
}      

如果小的循環在外層,對于資料庫連接配接來說就隻連接配接5次,進行5000次操作,如果1000在外,則需要進行1000次資料庫連接配接,進而浪費資源,增加消耗。這就是為什麼要小表驅動大表。

2.資料準備

根據MySQL進階知識(十)——批量插入資料腳本中的相應步驟在tb_dept_bigdata表中插入100條資料,在tb_emp_bigdata表中插入5000條資料。

MySQL進階知識(十六)——小表驅動大表
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的查詢時間為:

MySQL進階知識(十六)——小表驅動大表

将上面sql轉換成exists:

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

用exists的查詢時間:

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);      
MySQL進階知識(十六)——小表驅動大表
select *from tb_dept_bigdata A where exists(select 1 from tb_emp_bigdata B where B.deptno=A.deptno);      
MySQL進階知識(十六)——小表驅動大表

由于資料量并不是很大,是以對比并不是難麼的強烈。

附上視訊的結論截圖:

MySQL進階知識(十六)——小表驅動大表

4.總結

下面結論都是針對in或exists的。

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

簡記:in小,exists大。

對于exists

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

可以了解為:将主查詢的資料放入子查詢中做條件驗證,根據驗證結果(true或false)來決定主查詢的資料是否得以保留。

by Shawn Chen,2018.6.30日,下午。

相關内容

MySQL進階知識系列目錄

=========================================================

比你優秀的人比你還努力,你有什麼資格不去奮鬥!

__一個有理想的程式員。

繼續閱讀