前言:原本小表驅動大表的知識應該在前面就講解的,可是因爲以前並無學習數據批量插入,所以將其放在這裏。在查詢的優化中永遠小表驅動大表。html
相似循環嵌套sql
for(int i=5;.......) { for(int j=1000;......) {} }
若是小的循環在外層,對於數據庫鏈接來講就只鏈接5次,進行5000次操做,若是1000在外,則須要進行1000次數據庫鏈接,從而浪費資源,增長消耗。這就是爲何要小表驅動大表。數據庫
根據MySQL高級知識(十)——批量插入數據腳本中的相應步驟在tb_dept_bigdata表中插入100條數據,在tb_emp_bigdata表中插入5000條數據。windows
注:100個部門,5000個員工。tb_dept_bigdata(小表),tb_emp_bigdata(大表)。學習
①當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條數據。spa
用in的查詢時間爲:3d
將上面sql轉換成exists:code
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的查詢時間:
因爲數據量並非很大,所以對比並非難麼的強烈。
附上視頻的結論截圖:
下面結論都是針對in或exists的。
in後面跟的是小表,exists後面跟的是大表。
簡記:in小,exists大。
對於exists
select .....from table where exists(subquery);
能夠理解爲:將主查詢的數據放入子查詢中作條件驗證,根據驗證結果(true或false)來決定主查詢的數據是否得以保留。
by Shawn Chen,2018.6.30日,下午。