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

1.為什么要小表驅(qū)動(dòng)大表呢

類似循環(huán)嵌套

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

如果小的循環(huán)在外層,對(duì)于數(shù)據(jù)庫(kù)連接來(lái)說(shuō)就只連接5次,進(jìn)行5000次操作,如果1000在外,則需要進(jìn)行1000次數(shù)據(jù)庫(kù)連接,從而浪費(fèi)資源,增加消耗。這就是為什么要小表驅(qū)動(dòng)大表。

2.數(shù)據(jù)準(zhǔn)備

在tb_dept_bigdata表中插入100條數(shù)據(jù),在tb_emp_bigdata表中插入5000條數(shù)據(jù)。

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

3.案例演示

①當(dāng)B表的數(shù)據(jù)集小于A表數(shù)據(jù)集時(shí),用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條數(shù)據(jù),A表tb_emp_bigdata:5000條數(shù)據(jù)。

用in的查詢時(shí)間為:

將上面sql轉(zhuǎn)換成exists:

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

用exists的查詢時(shí)間:

經(jīng)對(duì)比可看到,在B表數(shù)據(jù)集小于A表的時(shí)候,用in要優(yōu)于exists,當(dāng)前的數(shù)據(jù)集并不大,所以查詢時(shí)間相差并不多。

②當(dāng)A表的數(shù)據(jù)集小于B表的數(shù)據(jù)集時(shí),用exists優(yōu)于in。

select *from tb_dept_bigdata A where A.deptno in(select B.deptno from tb_emp_bigdata B);

用in的查詢時(shí)間為:

將上面sql轉(zhuǎn)換成exists:

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

用exists的查詢時(shí)間:

由于數(shù)據(jù)量并不是很大,因此對(duì)比并不是難么的強(qiáng)烈。

附上視頻的結(jié)論截圖:

4.總結(jié)

下面結(jié)論都是針對(duì)in或exists的。

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

簡(jiǎn)記:in小,exists大。

對(duì)于exists

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

可以理解為:將主查詢的數(shù)據(jù)放入子查詢中做條件驗(yàn)證,根據(jù)驗(yàn)證結(jié)果(true或false)來(lái)決定主查詢的數(shù)據(jù)是否得以保留。

引用鏈接:在MySQL查詢中,為什么要用小表驅(qū)動(dòng)大表

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容