查詢優化 小表驅動大表(In,Exists區別)

2022-04-21 09:19:09 字數 1775 閱讀 8880

mysql 系列文章主頁

本文將以真實例子來講解小表驅動大表(in,exists區別)

1 準備資料

1.1 建立表、函式、儲存過程

參照  這篇(呼叫函式和儲存過程批量插入資料)  文章中的第 1-7 步,注意,不要執行第8步

1.2 插入資料

現在來執行第8步。

1.2.1 向 department 表中插入 100 條記錄

call insert_dept(1000, 100)

1.2.2 向 employee 表中插入 100000 條記錄

call insert_employee(100000000, 100000);

2 測試

2.1 查詢所有 employee 資訊,要求是:employee 的 dept_id 存在於 department 表中

case#1:用 in

select

*from employee where dept_id in (select id from department);

結果:在我本機測試了數十次,耗時大概是  120--130 ms

case#2:用 exists

select

*from employee e where

exists (select

1from department d where e.dept_id = d.id);

結果:在我本機測試了數十次,耗時大概是  350--370 ms

2.2 查詢所有 department 資訊,要求是:至少有一條 employee 記錄的 dept_id 對應 department(或者說:此部門下至少有一條員工記錄)

case#3:用 exists

select

*from department d where

exists (select

1from employee e where d.id = e.dept_id);

結果:在我本機測試了數十次,耗時大概是  4--6 ms

case#4:用 in

select

*from department where id in (select dept_id from employee);

結果:在我本機測試了數十次,耗時大概是  50--55 ms

2.3 分析並總結

在 case#1,#2 中,employee 是大表,department 是小表,用 in(department) 的效果較好(大概是用 exists 時間的三分之一)====> in 後面跟小表~

在 case#3,#4 中,employee 是大表,department 是小表,用 exists(employee) 的效果較好(大概是用 in 時間的十分之一)====> exists 後面跟大表~

記憶:in 後面跟小表~exists 後面跟大表~~~因為 in 這個單詞比 exists 單詞更短(更小),exists 這個單詞比 in 更長(更大)

2.4 進一步分析

至於為什麼 case#1 優於 case#2,case#3 優於 case#4,還沒搞清楚到底是為什麼,,,,,todo

一篇文章可供參考:

3 結論

小表驅動大表

in 小 exists 大

小表驅動大表

類似迴圈巢狀。for int i 5 如果小的迴圈在外層,對於資料庫連線來說就只連線5次,進行5000次操作,如果1000在外,則需要進行1000次資料庫連線,從而浪費資源,增加消耗。這就是為什麼要小表驅動大表。在tb dept bigdata表中插入100條資料,在tb emp bigdata表中...

mysql 大表 驅動 MySQL小表驅動大表

在了解之前要先了解對應語法 in 與 exist。in後的括號的表示式結果要求先輸出一列字段。與之前的搜尋字段匹配,匹配到相同則返回對應行。mysql的執行順序是先執行子查詢,然後執行主查詢,用子查詢的結果按條匹配主查詢。exist後的括號裡則無輸出要求,exist判斷後面的結果集中有沒有行,有行則...

MySQL 小表驅動大表

小表驅動大表 準備兩站表 create table student id int 11 notnull,no varchar 20 default null name varchar 20 default null primary key id engine innodb default chars...