MySQL高級知識(十六)——小表驅動大表


前言:本來小表驅動大表的知識應該在前面就講解的,但是由於之前並沒有學習數據批量插入,因此將其放在這里。在查詢的優化中永遠小表驅動大表。


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

類似循環嵌套

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

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

2.數據准備

根據MySQL高級知識(十)——批量插入數據腳本中的相應步驟在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_bigdata:100條數據,A表tb_emp_bigdata:5000條數據。

用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.總結

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

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

簡記:in小,exists大

對於exists

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

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


by Shawn Chen,2018.6.30日,下午。


相關內容

MySQL高級知識系列目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM