在MySQL查詢中,為什么要用小表驅動大表?即in 和exist 的區(qū)別

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

類似循環(huán)嵌套

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

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

2.數據準備

在tb_dept_bigdata表中插入100條數據,在tb_emp_bigdata表中插入5000條數據。

注:100個部門,5000個員工。tb_dept_bigdata(小表),tb_emp_bigdata(大表)。

3.案例演示

①當B表的數據集小于A表數據集時,用in優(yōu)于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要優(yōu)于exists,當前的數據集并不大,所以查詢時間相差并不多。

②當A表的數據集小于B表的數據集時,用exists優(yōu)于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)來決定主查詢的數據是否得以保留。

引用鏈接:在MySQL查詢中,為什么要用小表驅動大表

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容